Как безопасно использовать полиморфную модель в миграции Rails? - PullRequest
2 голосов
/ 16 декабря 2011

Я понимаю, что лучше всего определять ваши модели в процессе миграции, если вы манипулируете данными модели во время миграции.Однако, когда я пытаюсь создать build_other с полиморфной ассоциацией, атрибут polymorphic_type получает пространство имен модели с миграцией, в которой я ее объявил, что приводит к тому, что результирующий набор данных на самом деле не ассоциируется.

По сути, яв конечном итоге с адресами, для которых addressable_type установлен в «RemoveAddressColumnsFromEmployeesTable :: Employee» вместо просто «Employee».

Я могу исправить это, явно указав addressable_type и addressable_id, но это единственный способ обработать эту инкапсуляцию?

class RemoveAddressColumnsFromEmployeesTable < ActiveRecord::Migration

  class Employee < ActiveRecord::Base
    has_one :address, :as => :addressable, :inverse_of => :addressable
  end

  class Address < ActiveRecord::Base
    belongs_to :addressable, :polymorphic => true, :inverse_of => :address
  end

 def up
   Employee.all.each do |e|
     address                = e.build_address
     address.street_address = e.street_address
     address.apt_num        = e.apt_num
     address.city           = e.city
     address.state          = e.state
     address.zip            = e.zip
     e.save
   end

   remove_column :employees, :street_address
   remove_column :employees, :apt_num
   remove_column :employees, :city
   remove_column :employees, :state
   remove_column :employees, :zip
 end

 def down
   add_column :employees, :street_address, :string
   add_column :employees, :apt_num,        :string
   add_column :employees, :city,           :string
   add_column :employees, :state,          :string
   add_column :employees, :zip,            :string                                                                                                             

   Employee.all.each do |e|
     e.street_address = e.address.street_address
     e.apt_num        = e.address.apt_num
     e.city           = e.address.city
     e.state          = e.address.state
     e.zip            = e.address.zip
     e.address = nil
     e.save
   end
 end
end

1 Ответ

0 голосов
/ 12 марта 2013

Я нашел решение, которое устроило меня.В вашем случае это означает замену полиморфной ассоциации на следующую:

...