我有一个rails-api应用程序,用户可以在其中跟踪其他用户。检查一个记录是否存在于多关联中
要检查用户是否已经关注另一个用户,我需要在属性中包含一个查询,因此,我总是有一个N+1
查询问题。
这里是我的代码:
Index
行动用户控制器:
def index
@users = ::User.all.paginate(page: params[:page])
end
追随者将永远在User
模型default_scope
被包括在内。
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查询中生成一个动态属性,其中包含布尔值,如果是用户关注其他用户?
非常感谢您提前。
我在我的用户模型中有一个'default scope',它自动包含关注者。 – Tobias
我的错误。当我第一次读它时,我一定错过了那部分。看起来像在你的'jbuilder'的第2行中,你正在检查当前用户是否包含在追随者列表中,但不确定'follower(user)'方法正在做什么。也许你可以尝试'user.followers.include?(current_user)'来使用预先加载的关注者关联。 –
非常感谢! “包括”方法解决了这个问题。 – Tobias