Вопрос

Я хочу создать что-то, чтобы у человека могло быть много адресов электронной почты, а адрес электронной почты имел только одного человека, но поскольку у меня также есть другая модель под названием 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 в разделе "Полиморфные ассоциации".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top