渴望加载动态条件

时间:2013-05-28 09:39:24

标签: ruby-on-rails eager-loading

我有4个模特:

class Category < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :category
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :comments
end

我需要获取所有包含某个用户发表评论的帖子的类别。 我正在生成一个包含所有类别和帖子的json,但不会生成评论。

我正在使用的查询:

@categories = Category.includes(:posts => :comments).where(:comments => { :user_id => params[:user_id] } )

我正在使用rabl:

collection @categories
attributes ...
child :posts do
  attributes ...
end

但是这得到了所有评论。 如果我使用连接而不是包含,那么我将遇到n + 1问题。

我该如何进行查询?

1 个答案:

答案 0 :(得分:1)

includes方法仅对急切加载有帮助,它无法帮助您获取适当的记录。

你需要的可能是这样的:

# get all posts with comments made by the user
posts = Post.where(:comments => { :user_id => params[:user_id] })
# fetch the categories for those posts
@categories = Category.find(posts.map(&:category_id).uniq)