当前位置:  开发笔记 > 编程语言 > 正文

Rails模型has_many有多个foreign_keys

如何解决《Rails模型has_many有多个foreign_keys》经验,为你挑选了4个好方法。

相对较新的rails并尝试使用具有name,gender,father_id和mother_id(2个父项)的单个Person模型来建模一个非常简单的族"树".下面基本上是我想要做的,但显然我不能重复:has_many中的孩子(第一个被覆盖).

class Person < ActiveRecord::Base
  belongs_to :father, :class_name => 'Person'
  belongs_to :mother, :class_name => 'Person'
  has_many :children, :class_name => 'Person', :foreign_key => 'mother_id'
  has_many :children, :class_name => 'Person', :foreign_key => 'father_id'
end

是否有一种简单的方法可以将has_many与2个外键一起使用,或者根据对象的性别更改外键?或者还有其他/更好的方式吗?

谢谢!



1> Kenzie..:

在IRC上找到一个似乎有效的简单答案(感谢雷达):

class Person < ActiveRecord::Base
  belongs_to :father, :class_name => 'Person'
  belongs_to :mother, :class_name => 'Person'
  has_many :children_of_father, :class_name => 'Person', :foreign_key => 'father_id'
  has_many :children_of_mother, :class_name => 'Person', :foreign_key => 'mother_id'
  def children
     children_of_mother + children_of_father
  end
end



2> stevenspiel..:

为了改进Kenzie的答案,您可以通过定义以下内容来实现ActiveRecord Relation Person#children:

def children
   children_of_mother.merge(children_of_father)
end

有关详细信息,请参阅此答案


警告:正如您在回答中所解释的,关系与“ AND”合并。这不适用于本示例,因为这意味着您仅选择将`mother_id` *和*(而不是*或*)`father_id`设置为目标ID的人。我不是医生,但不应该经常发生:)

3> Zando..:

在Person模型上使用named_scopes执行以下操作:

class Person < ActiveRecord::Base

    def children
      Person.with_parent(id)
    end

    named_scope :with_parent, lambda{ |pid| 

       { :conditions=>["father_id = ? or mother_id=?", pid, pid]}
    }
 end



4> Gordon Wilso..:

我相信你可以使用:has_one实现你想要的关系.

class Person < ActiveRecord::Base
  has_one :father, :class_name => 'Person', :foreign_key => 'father_id'
  has_one :mother, :class_name => 'Person', :foreign_key => 'mother_id'
  has_many :children, :class_name => 'Person'
end

我会在下班后确认并编辑这个答案; )

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有