ruby-on-rails - ActiveRecord has_many 其中表 A 中的两列是表 B 中的主键

标签 ruby-on-rails ruby activerecord has-many

我有一个模型,Couple,它有两列,first_person_idsecond_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}"

那我该怎么做呢?

最佳答案

Couple 中声明的关系应该是这样的:

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 ...>>

那些在Person取决于是否 Person可以是多个的一部分Couple .如果 Person只能属于一个Couple不能成为“第一个”Person在一个和Second另一方面,您可能想要:

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

如果 Person可以属于几个 Couple s,并且没有办法判断它们是任何给定 Couple 中的“第一个”还是“第二个” ,你可能想要:

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

关于ruby-on-rails - ActiveRecord has_many 其中表 A 中的两列是表 B 中的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2125440/

相关文章:

ruby-on-rails - Rails 2.3.5 中用于 oAuth2 消费者和提供者功能的 Gem

ruby-on-rails - 如何将 RedCloth.to_html 转换回可编辑的普通文本?

ruby-on-rails - 如何正确地将测试 Rails 应用程序嵌入到它测试的 gem 中?

javascript - 如何制作可插入 JavaScript 文件的 Shopify 应用程序?

ruby - 如何在 Ruby 中循环嵌套数组

ruby-on-rails - 具有混合大小写列名称的小写方法名称

ruby-on-rails - 根据应用程序是否在 Facebook 框架内呈现/切换布局

mysql - 选择偏移量 > 0 的最大值返回 nil

ruby-on-rails - 如何使用 ruby​​ 的 find 方法通过名字和中间名的第一个字母来查找人员

ruby-on-rails - has_many和:after_add/:before_add => callback for << and create methods