0

我想构建一些东西,以便一个人可以有很多电子邮件地址,而一个电子邮件地址只有一个人,但是因为我还有另一个名为 Company 的模型,它也可以有很多电子邮件地址,我不想有列 company_id和电子邮件表中的person_id,所以我想我可以做......

人.rb

has_many :person_emails has_many :emails, :through => :person_emails

person_emails.rb

属于_to :person 属于_to :email

电子邮件.rb

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

现在发生的事情是……

p = Person.first #=> "Nik" p.emails #=> 显示 Nik 拥有的所有电子邮件 p.person_emails #=> 显示 Nik 的所有 person_email 联合表记录

e = Email.first #=> Nik 的电子邮件地址之一 e.person_email #=> 显示此电子邮件的唯一一个 person_email 联合表记录 e.person # 在 where 子句中说未知列“people.email_id”失败

我想要... e.person #=> "Nik"

有谁知道问题可能是什么?

谢谢你

4

1 回答 1

4

您的情况建议使用多态关联,这比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"or "Company",并且emailable_id存储关联对象的 id。有关更多信息,请参阅“多态关联”下的 Rails API 文档。

于 2010-01-21T22:51:41.610 回答