[英]How do I safely use a polymorphic model in a Rails migration?
我了解,如果要在遷移過程中處理模型數據,則最好在遷移過程中定義模型。 但是,當我嘗試使用多態關聯建立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
我找到了安排我的決定。 在您的情況下,這意味着替換下一個關聯的多態關聯:
class Employee < ActiveRecord::Base
has_one :address, :foreign_key => :addressable_id, :conditions => {:addressable_type => 'Employee'}
end
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.