Связь между двумя моделями наследования с одной таблицей
-
19-09-2019 - |
Вопрос
У меня есть следующие две модели
class ContactField < ActiveRecord::Base
end
class Address < ContactField
end
class Phone < ContactField
end
и
class Contact < ActiveRecord::Base
end
class Company < Contact
end
class Person < Contact
end
Я хочу, чтобы у одного контакта, независимо от того, компания это или человек, было много полей контактов (адресов и телефонов)...Так куда же мне положить эти имеет много и принадлежит?Спасибо
Решение
Вы уже сказали это простым языком :-)
Я хочу, чтобы у одного контакта, независимо от того, компания это или человек, было много полей контактов (адресов и телефонов)...Так куда же мне положить тех, кого много и кому они принадлежат?Спасибо
class Contact < ActiveRecord::Base has_many :contact_fields end class ContactField < ActiveRecord::Base belongs_to :contact end
Эти отношения будут унаследованы как по адресу, так и по телефону.
Другие советы
Похоже, вы описываете отношения, принадлежащие друг другу.Ассоциации должны быть определены в родительском классе, чтобы их могли унаследовать подклассы.
class ContactField < ActiveRecord::Base
belongs_to :contact
belongs_to :company, :foreign_key => :contact_id
belongs_to :person, :foreign_key => :contact_id
end
class Contact < ActiveRecord::Base
has_many :contact_fields
has_many :addresses
has_many :phones
end
Однако @contact.contact_fields просто вернет записи ContactField.Если вам нужны методы, определенные в каком-либо из подклассов, вы всегда можете использовать метод Does.Есть несколько способов обойти это.Такое добавление лишних ассоциаций, как это сделал я.Или используя ActiveRecord::Base#становится