has_one: через модель соединения - PullRequest
0 голосов
/ 22 января 2010

Я хочу создать что-то, чтобы у человека было много адресов электронной почты, а у адреса электронной почты был только один человек, но у меня также есть другая модель под названием Компания, которая также может иметь много адресов электронной почты, и я не хочу есть столбцы company_id и person_id в таблице электронных писем, поэтому я подумал, что могу сделать ...

person.rb

has_many: person_emails has_many: электронные письма,: through =>: person_emails

person_emails.rb

принадлежит_ человеку принадлежат: электронная почта

email.rb

has_one: person_email has_one: person,: through =>: person_email

Что сейчас происходит, так это ...

p = Person.first # => "Ник" p.emails # => показывает все электронные письма, которые есть у Nik p.person_emails # => показывает все записи объединенной таблицы person_email для Nik

e = Email.first # => один из адресов электронной почты Nik e.person_email # => показывает одну и только одну запись объединенной таблицы этого письма person_email e.person # не может сказать, что неизвестный столбец "people.email_id" в предложении where

Я бы хотел ... e.person # => "Ник"

Кто-нибудь знает, в чем может быть проблема?

Спасибо

1 Ответ

4 голосов
/ 22 января 2010

Ваша ситуация предлагает использовать полиморфные ассоциации, которые намного чище, чем 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 в разделе "Полиморфные ассоциации".

...