the*_*jaz 5 activerecord ruby-on-rails ruby-on-rails-3
我有以下型号:
class Rating < ActiveRecord::Base
belongs_to :item
belongs_to :user
end
class Item < ActiveRecord::Base
has_many :ratings
end
Run Code Online (Sandbox Code Playgroud)
我想获取所有项目,以及特定用户的评级,以显示每个项目旁边的当前用户评级(如果存在!).
我试过了...
Item.includes(:ratings).where('ratings.user_id = ?', user_id)
Run Code Online (Sandbox Code Playgroud)
...但是没有给我没有评级的项目.
我的第一个想法是与参数的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
Run Code Online (Sandbox Code Playgroud)
Rails 3.1及以上版本
class Item < ActiveRecord::Base
has_many :ratings
has_many :current_user_ratings,
:class_name => "Rating",
:conditions => proc { ["ratings.user_id = ?", User.current_user.try(:id)] }
end
Run Code Online (Sandbox Code Playgroud)
第3步
Item.includes(:current_user_ratings)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3516 次 |
| 最近记录: |