ruby-on-rails – 活动记录:预先加载与参数的关联

我有以下型号:

class rating < ActiveRecord::Base
  belongs_to :item
  belongs_to :user
end

class Item < ActiveRecord::Base
  has_many :ratings
end

我想获取所有项目,以及特定用户的评级,以显示每个项目旁边的当前用户评级(如果存在!).

我试过了…

Item.includes(:ratings).where('ratings.user_id = ?',user_id)

…但是没有给我没有评级的项目.

我的第一个想法是与参数的has_many关联,然后使用includes方法传递该参数.但这似乎并不存在.

如何在不执行N 1查询或将所有实体加载到内存中的情况下,在参数上过滤所有帖子和预先加载的关联?

解决方法

步骤1

使模型层中的current_user可访问(此处概述了一种技术:https://stackoverflow.com/a/2513456/163203)

第2步

添加与在运行时评估的条件的关联.

Rails 2

class Item < ActiveRecord::Base
  has_many :ratings
  has_many :current_user_ratings,:class_name => "rating",:conditions => 'ratings.user_id = #{User.current_user.try(:id)}'
end

Rails 3.1及以上版本

class Item < ActiveRecord::Base
  has_many :ratings
  has_many :current_user_ratings,:conditions => proc { ["ratings.user_id = ?",User.current_user.try(:id)] }
end

第3步

Item.includes(:current_user_ratings)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...