У меня есть модель, Couple
, который имеет два столбца, first_person_id
и second_person_id
и другая модель, Person
, чей первичный ключ person_id
и имеет столбец name
Вот использование, которое я хочу:
#including 'Person' model for eager loading, this is crucial for me
c = Couple.find(:all, :include => :persons)[0]
puts "#{c.first_person.name} and #{c.second_person.name}"
Таким образом, как я могу сделать это?
Отношения, объявленные в Паре
, должны выглядеть следующим образом:
class Couple
named_scope :with_people, { :include => [:first_person, :second_person] }
belongs_to :first_person, :class_name => 'Person'
belongs_to :second_person, :class_name => 'Person'
end
#usage:
Couple.with_people.first
# => <Couple ... @first_person: <Person ...>, @second_person: <Person ...>>
Отношения в Человеке
зависят от того, может ли Человек
быть частью более чем одной Пары
. Если Человек
может принадлежать только одной Паре
и не может быть "первым" Человеком
на одном и Вторым
на другом, вы можете захотеть:
class Person
has_one :couple_as_first_person, :foreign_key => 'first_person_id', :class_name => 'Couple'
has_one :couple_as_second_person, :foreign_key => 'second_person_id', :class_name => 'Couple'
def couple
couple_as_first_person || couple_as_second_person
end
end
Если Человек
может принадлежать нескольким Парам
, и нет способа сказать, являются ли они "первыми" или "вторыми" в любой данной Паре
, вы можете захотеть:
class Person
has_many :couples_as_first_person, :foreign_key => 'first_person_id', :class_name => 'Couple'
has_many :couples_as_second_person, :foreign_key => 'second_person_id', :class_name => 'Couple'
def couples
couples_as_first_person + couples_as_second_person
end
end
непроверенные, но по словам документации API , может быть, что-то вроде:
class Couple < ActiveRecord::Base
has_one :person, :foreign_key => :first_person_id
has_one :person, :foreign_key => :second_person_id
end
ТОЛЬКО Теория, непроверенная:
Создать два подкласса человека:
class FirstPerson < Person
belongs_to :couple
class SecondPerson < Person
belongs_to :couple
Пара класса HAS_MANY каждого:
class Couple
has_many :first_persons, :foreign_key => :first_person_id
has_many :second_persons, :foreign_key => :second_person_id
Тогда найти:
Couple.all(:include => [:first_persons, :second_persons])