2014-11-13 5 views
1

Мой новый проект 4.1 рельсов имеет следующие полиморфные ассоциации.рельсы полиморфные добавить с помощью <<

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

Проблема заключается в том, что при миграции вы не используете класс из приложения/моделей, а тот, который находится внутри вашей миграции. Проверьте через rails console что находится в столбце line_itemable_type для выбранного LineItem. Вместо 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

Смежные вопросы