'ratings.user_id = #{User.current_user.try-6ren">
gpt4 book ai didi

ruby-on-rails - 事件记录 : Eager load association with parameter

转载 作者:行者123 更新时间:2023-12-04 06:23:56 25 4
gpt4 key购买 nike

我有以下型号:

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,
:class_name => "Rating",
:conditions => proc { ["ratings.user_id = ?", User.current_user.try(:id)] }
end

步骤 3
Item.includes(:current_user_ratings)

关于ruby-on-rails - 事件记录 : Eager load association with parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15542850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com