[英]Rails 2 way association not functioning
我有點問題。 我一直在開發一個Rails應用程序,並遇到了一個我無法解決的問題。
截至目前,我的應用程序允許用戶將產品詳細信息輸入數據庫(存儲在“產品表”中)這是我正在使用的數據庫的模式。
ActiveRecord::Schema.define(version: 20140126073333) do
create_table "ijns", force: true do |t|
t.integer "number"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "quantity"
end
add_index "ijns", ["number"], name: "index_ijns_on_number"
create_table "products", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "ijn_id"
end
add_index "products", ["name"], name: "index_products_on_name"
end
還有另一個名為'ijns'的表,它為每個產品分配一個唯一的標識符。 這個ijn並沒有故意成為主鍵,因為我不希望它是一個自動遞增的值。
b / w IJN和Product的關系是:
產品has_many ijns和An ijn屬於一個產品。
這是我的產品模型
class Product < ActiveRecord::Base
has_many :ijns
validates :name, presence: true, length: { minimum: 10 }, uniqueness: true
end
IJN的模型。
class Ijn < ActiveRecord::Base
belongs_to :product
validates :number, presence: true, uniqueness: true, length: { is: 4 }, numericality: { only_integer: true }
validates :product_id, presence: true
validates :quantity, presence: true
end
我可以從IJN方面獲得關聯,即,我可以通過使用以下內容訪問產品模型的字段:
@ijn.product.name
但是我無法從產品模型訪問'ijns'表的'number'字段
我希望我已經清楚地解釋了我的問題。 如果需要其他信息,請告訴我。 急切等待一些回復! :)
第一編輯:
當我在sqlite3數據庫瀏覽器中查看我的'products'表時,ijn_id的列存在,但由於某種原因,沒有條目。 這是一個截圖:
問題是你已經定義了一個Product
has_many
:ijns
。 這與具有您架構中的ijn_id
的產品沖突。
因此,當您嘗試執行product.ijn
您會收到錯誤消息。
編輯:
如果產品真的有很多ijns,那么ijn_id
對ActiveRecord和數據庫毫無意義。 他們不知道它應該引用哪個。 我懷疑你希望它引用分配給產品的最后一個ijn。
在這種情況下,一種解決方案是將屬性更改為類似current_ijn_id
。 每次需要更新時,您都必須手動分配值。
或者你可以做product.ijns.last
。 問題是你需要確保.last
都會給你正確的ijn。 例如,如果由於某種原因你將產品“回滾”到舊的ijn,它可能不起作用。
似乎你讓這比你需要的更復雜:
表
您的ijn
號碼就像SKU (您的系統的唯一標識符)對嗎? 由於它是產品的屬性,為什么不將它放在產品表中:
#products table
id | ijn | name | created_at | updated_at
這立即否定了對額外表的要求(也保存了查詢)
額外
如果你想調用額外的數據為您product
,您將需要一個表專為數據
對我而言, model
是具有特定目的的數據集合。 擁有ijn
的模型並不能構成這一點
#app/models/products.rb
Class Product < ActiveRecord::Base
has_one :profile, class_name: "ProductProfile"
end
#app/models/product_profile.rb
Class ProductProfile < ActiveRecord::Base
belongs_to :product
end
這將允許您調用類似@product.profile.quantity
或類似的東西
puts Product.first.ijn.number
這應該根據你想要做的工作。
非常感謝你的幫助...我做了一些閱讀並找到了我的解決方案..對於像我一樣的一對多關系,你只需要在一邊提供引用表的'id',即包括'ijn'表中的'product_id'列。 我刪除了'products'表中的'ijn_id'列,並在我的'ProductsController'中包含了一行代碼。 這里是:
...
def show
@product = Product.find(params[:id])
#getting the related IJN
@ijn = Ijn.find(:all, :conditions => ['product_id = ?',@product])
end
...
現在,在視圖中,只需執行即可引用關聯的產品名稱
<% @ijn.map do |i| %>
<tr>
<td><%=i.number %></td>
<td><%= i.quantity %></td>
<td><%= i.name %></td> #this returs the assocaiated product name
<td><%= Date::MONTHNAMES[i.product.created_at.month] %></td>
<td>placeholder</td>
<td>placeholder</td>
</tr>
<% end %>
返回產品名稱和關聯的IJN列表。 我沒有在上面的代碼中添加任何樣式。
我希望這有助於其他遇到類似問題的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.