簡體   English   中英

如何在Rails遷移中安全地使用多態模型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM