2014-11-13 167 views
1

我的新rails 4.1項目具有以下多態關聯。rails多態添加<<

class Order < ActiveRecord::Base 
    has_many :line_items, as: :line_itemable 
end 
class LineItem < ActiveRecord::Base 
    belongs_to :line_itemable, polymorphic: true 
end 
class Shipment < ActiveRecord::Base 
    has_many :line_items, as: :line_itemable 
end 

我試圖移植一些舊的數據,所以我在我的seeds.rb文件

neworder = Order.create do |order| 
    ... 
end 
neworder.line_items << LineItem.create do |li| 
    ... 
end 

的< <過去一直爲我工作。在我的舊制度,我沒有出貨量類,所以我不得不

class Order < ActiveRecord::Base 
    has_many :line_items 
end 
class LineItem < ActiveRecord::Base 
    belongs_to :order 
end 

和< <只是工作。現在,我已經能夠通過使用

neworder = Order.create do |order| 
    ... 
end 
newlineitem = LineItem.create do |li| 
    ... 
end 
newlineitem.update_attribute(:line_itemable, neworder) 

這似乎不像鐵軌方式做事情。難道我做錯了什麼?

回答

0

問題是,在遷移中,您不使用app/models中的類,而是使用移植中的類。請通過rails console檢查,的line_itemable_type列的內容。而不是Order你會看到YourMigrationName::Order,這解釋了一切。

通常情況下,您的方法是正確的 - 如果需要它的工作,在遷移中定義代碼是一種好的做法。只有一個與多態關聯的問題:)我認爲沒有最好的方法來處理它 - 可以手動設置type(這是我會做的),可以手動創建SQL查詢(如果您需要創建很多對象,這可能是要走的路,但不應該放在IMO的遷移中)。你可以例如像這樣設置類型:

newlineitem = LineItem.create do |li| li.line_itemable_type = 'Order' li.line_itemable_id = neworder.id # other stuff you have end

相關問題