2011-12-15 76 views
2

我知道如果在遷移期間操作模型數據,在遷移中定義模型是一種最佳實踐。但是,當我嘗試使用多態關聯構建時,polymorphic_type屬性獲取了模型名稱空間給我聲明的遷移,導致結果數據集沒有真正關聯。如何在Rails遷移中安全地使用多態模型?

基本上,我最終將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 
+0

這是很久以前問的。你有沒有想過一個更好的方法?我想發佈相同的問題,但如果我這樣做,它將被標記爲您的重複。 – Trejkaz 2012-10-14 22:26:05

回答

0

我找到了安排我的決定。在你的情況下,這意味着替換下一個關聯的多態關聯:

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