让我们说我有一个产品模型,一个用户模型和一个定义如下的评论模型:
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
哪个不起作用。我错误地使用它了吗?
提前致谢。
答案 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)