2011-12-15 1 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

+0

Кто-нибудь нашел решение по этой проблеме? – MikDiet

ответ

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