2015-11-12 2 views
0

у меня есть человек модель, я хочу, чтобы подключиться к нескольким адресам (main_address, work_address и т.д.)рельсов 4 миграции один человек несколько адресов: ActiveRecord ошибка STI

В приложении/модели/person.rb:

class Person < ActiveRecord::Base 

    belongs_to :main_address, class_name: :Address, foreign_key: :main_address_id 
    belongs_to :work_address, class_name: :Address, foreign_key: :work_address_id 
    belongs_to :invoice_address, class_name: :Address, foreign_key: :invoice_address_id 
    belongs_to :further_address, class_name: :Address, foreign_key: :further_address_id 

end 

И адрес модель:

class Address < ActiveRecord::Base 
    belongs_to :person 
end 

адрес миграции:

class CreateAddresses < ActiveRecord::Migration 
    def change 
    create_table :addresses do |t| 
     t.string :street 
     t.string :zip 
     t.string :city 
     t.string :country 
     t.string :lockbox 
     t.string :type 
     t.references :person, index: true, foreign_key: true 

     t.timestamps null: false 
    end 
    end 
end 

приложения/модель/main_address.rb:

class MainAddress < Address 
end 

Когда я пытаюсь сохранить адрес в рельсах консоли (люди с идентификатором 1 уже был создан):

2.2.1 (main):0 > main_address = Address.create(type: "main_address", street: "Schumannstr.15", zip: "D-53113", city: "Bonn", country: "Germany", person_id: 1) 

Я получаю ошибку :

ActiveRecord::SubclassNotFound: Invalid single-table inheritance type: main_address is not a subclass of Address 

Что я делаю неправильно?

+0

У вас есть класс, определенный для каждого типа main_address, work_address и т. Д.? – Phil

+0

Да, я забыл упомянуть их. Я обновил свой пост. – StandardNerd

ответ

1

Я думаю, что может возникнуть проблема с вашими ассоциациями belongs_to. Мне кажется, что адрес принадлежит человеку, и у человека много адресов. Если концептуально это не соответствует вашим требованиям, тогда остальная часть этого ответа должна быть адаптирована.

Кроме того, в исходном примере вы указываете внешние ключи, которые не существуют в качестве столбцов в таблице адресов. На каждый адрес будет называться только ID и тип пара.

Я ожидал бы этот тип кода для работы:

# app/models/person.rb 
class Person < ActiveRecord::Base 
    has_many :addresses 
end 

# app/models/address.rb 
class Address < ActiveRecord::Base 
    belongs_to :person  
end 

# app/models/main_address.rb 
class MainAddress < Address 
end 

типа столбец в таблице должен вызывать ИППП, что позволяет сделать что-то вроде:

person = Person.create(...) 
person.addresses.create(street: "Schumannstr.15", zip: "D-53113", city: "Bonn", country: "Germany") 

Надеюсь, это будет работа для вас. Если нет, не стесняйтесь редактировать или комментировать при необходимости.

Смежные вопросы