2015-09-22 79 views
0

我有一个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查询中生成一个动态属性,其中包含布尔值,如果是用户关注其他用户?

非常感谢您提前。

回答

1

我的第一个想法是,当你得到像这样的用户列表@users = ::User.all.includes(:followers).paginate(page: params[:page])时,我会首先想到使用.includes方法加载追随者。但也许,我不正确地理解你的问题?让我知道这是否有效,或者我是否应该将答案集中在另一个主题上。谢谢!

编辑:从下面的意见正确答案:

或许你可以尝试user.followers.include?(current_user)利用预加载的追随者的关联。

+0

我在我的用户模型中有一个'default scope',它自动包含关注者。 – Tobias

+1

我的错误。当我第一次读它时,我一定错过了那部分。看起来像在你的'jbuilder'的第2行中,你正在检查当前用户是否包含在追随者列表中,但不确定'follower(user)'方法正在做什么。也许你可以尝试'user.followers.include?(current_user)'来使用预先加载的关注者关联。 –

+0

非常感谢! “包括”方法解决了这个问题。 – Tobias