Есть ли более эффективный способ создания отношения ActiveRecord для класса, который ссылается на себя через другую таблицу? - PullRequest
1 голос
/ 27 мая 2011

Я прошу прощения, если название вопроса сбивает с толку. У меня следующая ситуация: у меня есть модель 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 Ответ

1 голос
/ 27 мая 2011

Я бы действительно использовал самообращающиеся ассоциации для такого рода целей.

Se учебник здесь: http://railscasts.com/episodes/163-self-referential-association

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...