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

Ruby on rails 获取自联接对象及其子对象上的所有关联对象,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我试图找到所有与我的个人、自加入、记录及其所有孩子相关的朋友 下面是我正在尝试运行的一个示例。我有一个人的记录,我们叫它@Person,它有4个“孩子” 这些孩子都有很多朋友 当我查询@person时,我想要它自己的所有朋友,然后是它下面的四个孩子 有没有不去的方法:friends=@parent.friends+@parent.children.map{| c | c.friends} 我真的很想用一个数据库查询就可以了。我的数据库也是postgresql 下面是如何设置我的记录的示例 cla

我试图找到所有与我的个人、自加入、记录及其所有孩子相关的朋友

下面是我正在尝试运行的一个示例。我有一个人的记录,我们叫它
@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
class-Person“Person”,:foreign\u-key=>“parent\u-Person\u-id”
有多个:子项,:class\u name=>“Person”,:foreign\u key=>“parent\u Person\u id”
你有很多朋友吗
结束
类友元
对于儿童,您的外键必须是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)

祖先

你为什么不看看这张照片

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

#app/models/person.rb
Class Person < ActiveRecord::Base
   has_ancestry
end
@person = Person.find params[:id]
@person.children.each do |child|
     child.name
end
以下是您的
模型
附带的
方法:

--

警告

需要注意的是,如果需要多个嵌套项,则需要像上面的示例中那样使用“设置父项的整个树”:

parent_id_1/parent_id_2

对于儿童,foregin键应该是
id
,而不是
parent\u person\u id
@arivarasan-它当前的设置方式。我肯定能找到孩子和父母的记录。我的记录中的字段是:
id:integer、parent\u genre\u id:integer、title:string、created\u at:datetime、updated\u at:datetime
。谢谢您的回答。我知道我能抓到所有做类似于你答案的事情的孩子的id。我可以用两个数据库查询来完成,而不用使用“.pull(:id)”将所有记录拉入ruby。你知道如何把你的两个数据库查询组合成一个数据库吗?嗯,试试快速加载,像人一样。包括(朋友)。在哪里(ID:PosiPosiIDS),我认为你不能消除调用子查询THO。为什么不考虑使用MunGDB之类的NoSQL数据库呢?您将能够将数据嵌入到Person表中,并且查询结果将需要固定的时间?请尝试此方法,并让我知道它是否适合您。Person.includes(:friends).where(“parent_id=?或id=?”,[@parent.id,@parent.id])。friends使用where语句的参数修复了您的文件中的一个小错误。如果
.friends
在最后,我可以得到这个人和他们所有的孩子,但不能得到他们的朋友<代码>个人。包括(:朋友)。其中(“parent_id=?或id=?”,@parent.id,@parent.id)。朋友
是的,我看了看那个家伙。对于我目前所需要的东西来说,这太过分了。真的只有一个父母和一个孩子级别的人了。不过我一定会记住的!