检查有多少关联中是否存在记录

时间:2015-09-22 07:12:20

标签: sql ruby-on-rails json postgresql rails-api

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

非常感谢你。

1 个答案:

答案 0 :(得分:1)

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

编辑:从以下评论中得出正确答案:

也许您可以尝试user.followers.include?(current_user)来使用预先加载的关注者关联。