has_one : сквозная модель объединения
-
22-09-2019 - |
Вопрос
Я хочу создать что-то, чтобы у человека могло быть много адресов электронной почты, а адрес электронной почты имел только одного человека, но поскольку у меня также есть другая модель под названием Company, которая также может иметь много адресов электронной почты, и я не хочу иметь столбцы company_id и person_id в таблице электронных писем, поэтому я подумал, что могу сделать...
персона.рб
has_many:person_emails has_many: электронные письма, :через =>:person_emails
person_emails.rb
belongs_to: лицо belongs_to: электронная почта
электронная почта.rb
has_one:person_email has_one:person, :через => :person_email
Вот что сейчас происходит...
p = Person.first #=> "Nik" p.электронные письма #=> показывает все электронные письма, которые есть у Ника p.person_emails #=> показывает все записи совместной таблицы person_email для Ника
e = Email.first #=> один из адресов электронной почты Ника e.person_email #=> показывает одну и только одну запись в общей таблице person_email для этого электронного письма e.person # выдает ошибку, указывая неизвестный столбец "people.email_id" в where-предложении
Я бы хотел...e.person #=> "Ник"
У кого-нибудь есть идеи, в чем может заключаться проблема?
Спасибо
Решение
Ваша ситуация предполагает использование полиморфных ассоциаций, которые намного чище, чем has_many :through
ассоциации.Например:
class Person
has_many :emails, :as => :emailable
end
class Company
has_many :emails, :as => :emailable
end
class Email
belongs_to :emailable, :polymorphic => true
end
Вы можете избавиться от своего PersonEmails
класс целиком.В базе данных ваш emails
таблица будет выглядеть примерно так:
create_table :emails do |t|
t.string :address
t.string :emailable_type
t.integer :emailable_id
end
Тот самый emailable_type
в столбце хранится название связанной модели, в вашем случае "Person"
или "Company"
, и тот emailable_id
сохраняет идентификатор связанного объекта.Для получения дополнительной информации см. документация Rails API в разделе "Полиморфные ассоциации".