获取自联接对象及其子对象上的所有关联对象

时间:2014-07-02 03:50:26

标签: ruby-on-rails ruby postgresql

我正在尝试用我的人,自我加入,记录及其所有孩子找到所有相关的朋友。

这是我试图运行的一个例子。我有个人记录,我们称之为@person,有4个孩子'。

这些孩子都有很多朋友。

当我查询@person时,我想要自己的所有朋友,然后是下面的四个孩子。

有没有办法不办理:friends = @parent.friends + @parent.children.map {|c| c.friends }

真的很想用一个数据库查询来做这件事。我的数据库也是postgresql。

以下是我的记录设置方式的示例。

class Person < ActiveRecord::Base

  belongs_to :parent, :class_name => "Person", :foreign_key => "parent_person_id"
  has_many :children, :class_name => "Person", :foreign_key => "parent_person_id"
  has_many :friends

end

class Friend < ActiveRecord::Base
  belongs_to :person
end

2 个答案:

答案 0 :(得分:5)

对于儿童,您的 foreign_key 必须为 id

has_many :children, :class_name => "Person", :foreign_key => "id"

试试这个:

people_ids = @parent.children.map(&:id).push(@parent.id)
Friend.where(person_id: people_ids)

或者你可以急切地加载相关的表格,如:

friends = Person.includes(:friends).where("parent_person_id = ? or id = ?", [@parent.id, @parent.id]).map(&friends)

答案 1 :(得分:1)

<强>祖先

为什么不看ancestry gem

这基本上允许您在模型中定义children,而无需定义关联(从而防止不必要的查询)。你可以这样做:

#app/models/person.rb
Class Person < ActiveRecord::Base
   has_ancestry
end

gem会在您的表格中创建一个ancestry列,您可以使用“子”对象填充该列:

enter image description here

这允许您选择模型的children,如下所示:

@person = Person.find params[:id]
@person.children.each do |child|
     child.name
end

以下各种方法has_ancestry附加到model

enter image description here

-

<强>买者

需要注意的是,如果你想要多嵌套项目,你需要使用像我们上面的例子中那样设置整个父树:

parent_id_1/parent_id_2