ActiveRecord has_many, где два столбца в таблице A являются первичными ключами в таблице B

У меня есть модель, 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}"

Таким образом, как я могу сделать это?

7
задан user94154 24 January 2010 в 00:57
поделиться

3 ответа

Отношения, объявленные в Паре , должны выглядеть следующим образом:

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
14
ответ дан 6 December 2019 в 15:22
поделиться

непроверенные, но по словам документации API , может быть, что-то вроде:

class Couple < ActiveRecord::Base
    has_one :person, :foreign_key => :first_person_id
    has_one :person, :foreign_key => :second_person_id
end
0
ответ дан 6 December 2019 в 15:22
поделиться

ТОЛЬКО Теория, непроверенная:

Создать два подкласса человека:

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])
0
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: