活动记录查询多个父对象的子对象

时间:2016-02-25 15:57:21

标签: ruby-on-rails ruby activerecord rails-activerecord

我们说我有两种模式:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

然后假设我创建了2个帖子,每个帖子有3条评论。是否有一个查询我可以调用这两个帖子的AR关系来获取属于这两个帖子的所有评论?

我能做到:

@posts = Post.where(id: [1,2])
@comments = []
@posts.each do |post|
  @comments += post.comments
end

但是它不是AR关系,而且看起来这应该是一个简单的查询。

@posts.comments吗?

2 个答案:

答案 0 :(得分:1)

您的问题谈到“属于这两个帖子”,但您建议使用Post.all,因此不清楚您是否关注所有帖子的评论,或仅仅是那两个帖子。

以下是如何获取这两个帖子的评论,比如他们的ID是12

Comment.where post_id: [ 1, 2 ]

...但是如果您不知道ID,那么您可以使用任何您想要的查询来返回您感兴趣的帖子来创建子选择,例如:

Comment.where post: Post.where(owner: owner)
Comment.where post: Post.where("title LIKE ?", "%abc%")

或者,您可以使用评论中的联接发布,如下所示:

Comment.joins(:post).where(posts: { owner: owner })

所以有一些选择可以做我认为你在问的问题。

答案 1 :(得分:0)

  

我可以在Post.all上调用查询以获取属于这两个帖子的所有评论吗?

如果您只是想获取属于帖子的所有评论,请执行此操作

Comment.where.not(post_id: nil)