我有一个rails-api应用程序,用户可以在其中关注其他用户。
要检查用户是否已关注其他用户,我需要在属性中包含查询,因此,我始终存在N+1
查询问题。
这是我的代码:
用户控制器中的 Index
操作:
def index
@users = ::User.all.paginate(page: params[:page])
end
default_scope
模型中的User
将始终包含关注者。
index.json.jbuilder:
json.partial! 'attributes', collection: @users, as: :user
_attributes.json.jbuilder:
json.extract! user, :id, :firstname, :lastname, :username, :follower_count
is_follower = user.follower.find_by(id: current_user.id).present? if current_user
json.following is_follower
结果:
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 14]]
Rendered v1/user/users/_attributes.json.jbuilder (1.3ms)
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 9]]
Rendered v1/user/users/_attributes.json.jbuilder (1.4ms)
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1 [["followed_id", 13]]
是否有一些解决方法或是否可以在SQL查询中生成动态属性,如果用户跟随其他用户,则包含布尔值?
非常感谢你。
答案 0 :(得分:1)
我首先想到的是,当你获得像.includes
这样的用户列表时,会急切地使用@users = ::User.all.includes(:followers).paginate(page: params[:page])
方法加载关注者。但也许,我没有正确理解你的问题?让我知道这是否有效,或者我是否应该将我的答案集中在另一个主题上。谢谢!
编辑:从以下评论中得出正确答案:
也许您可以尝试user.followers.include?(current_user)
来使用预先加载的关注者关联。