如何批量查询Rails中的关联?

时间:2014-07-05 22:40:55

标签: ruby-on-rails activerecord

让我们说我有一个产品模型,一个用户模型和一个定义如下的评论模型:

class Product
  has_many :reviews
end

class User
  has_many :reviews
end

class Review
  belongs_to :product
  belongs_to :model
end

现在在控制器方法中,我有一个current_user变量。我正在尝试通过current_user获取产品列表及其评论。

目前我正在做这样的事情:

class ProductsController
  def index
    @products = Product.page(1)
  end
end

# in index.html.erb

<%= @products.each do |product| %>
  <%= product.reviews.find_by(user: current_user).rating %>
<% end %>

但它为每个product.reviews.find_by调用生成一个SQL查询。无论如何我可以避免这个吗?

我尝试将控制器中的代码修改为:

class ProductsController
  def index
    @products = Product.page(1).include(:reviews)
  end
end

哪个不起作用。我错误地使用它了吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

像这样使用

# controller
@products = Product.includes(:reviews).page(1)

# view
<%= @products.each do |product| %>
  <%= product.reviews.select{ |user| user.id == current_user.id }.rating %>
<% end %>

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

编辑: 你可以在包含上过滤这样的性能

@products = Product.includes(:reviews).where("reviews.user_id" => 1).page(1)