是否有更有效的方法在通过另一个表引用自身的类上创建ActiveRecord关系?

时间:2011-05-26 21:45:10

标签: ruby-on-rails activerecord

如果问题标题令人困惑,我道歉。我有以下情况:我有一个Person模型,它以标准方式在people表中存储人员。

我需要在has_many模型上为emergency_contacts添加Person关系。我尝试通过以下方式执行此操作:

迁移:

create_table :people do |t|
  t.string :first
  t.string :middle
  t.string :last

  t.timestamps
end
create_table :emergency_contacts, :id => false do |t|
  t.integer :person_id
  t.integer :emergency_contact_id

  t.timestamps
end

型号:

class Person < ActiveRecord::Base
  has_many :emergency_contacts

  validates :first, :presence => true
  validates :last, :presence => true
end
class EmergencyContact < ActiveRecord::Base
  belongs_to :person
  has_one :person, :foreign_key => 'emergency_contact_id'
end

这允许我这样做:

ruby-1.9.2-p180 :001 > p = Person.new(first: "John", last: "Doe")
 => #<Person id: nil, first: "John", middle: nil, last: "Doe", created_at: nil, updated_at: nil> 
ruby-1.9.2-p180 :002 > ec = EmergencyContact.new
 => #<EmergencyContact person_id: nil, emergency_contact_id: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p180 :003 > ec.emergency_contact = Person.new(first: "Peter", last: "Griffin")
 => #<Person id: nil, first: "Peter", middle: nil, last: "Griffin", created_at: nil, updated_at: nil> 
ruby-1.9.2-p180 :004 > p.emergency_contacts << ec
 => [#<EmergencyContact person_id: nil, emergency_contact_id: nil, created_at: nil, updated_at: nil>] 
ruby-1.9.2-p180 :005 > p.save!
 => true 

但是,我不认为EmergencyContact模型应该在那里,因为我实际上只是引用Person模型。

有没有办法删除这个“中间人”模型,以便我可以做类似的事情:

p = Person.new(first: "John", last: "Doe")
p.emergency_contacts << Person.new(first: "Peter", last: "Griffin")

1 个答案:

答案 0 :(得分:1)

为了这种目的,我真的会使用自我引用关联。

这里的教程:http://railscasts.com/episodes/163-self-referential-association