【问题标题】:Check if a record is present in a has-many association检查一条记录是否存在于一个有多个关联中
【发布时间】:2015-09-22 07:12:20
【问题描述】:

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

非常感谢您。

【问题讨论】:

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


    【解决方案1】:

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

    编辑:以下 cmets 的正确答案:

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

    【讨论】:

    • 我的用户模型中有一个default scope,它会自动包含关注者。
    • 我的错误。当我第一次阅读它时,我一定错过了那部分。似乎在您的 jbuilder 的第 2 行中,您正在检查当前用户是否包含在关注者列表中,但不确定 follower(user) 方法在做什么。也许您可以尝试user.followers.include?(current_user) 来使用预加载的关注者协会。
    • 非常感谢! ìnclude?` 方法解决了这个问题。
    • follower(user) 方法对我来说是一个非常危险的错误。它不会加载包含current_user 的关注者。我已经修复它并修改了问题。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2017-06-18
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多