Sql 获取具有书签状态的记录列表

Sql 获取具有书签状态的记录列表,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我有一个应用程序,用户可以在其中为帖子添加书签。为了处理书签,我创建了一个名为Bookmark的多态模型 现在我需要显示所有帖子的列表(比如每页50篇,分页),其中包含当前登录用户的标题和书签状态 我脑子里有两种情况,我怎样才能做到这一点。我一个都不喜欢 在呈现列表时,检查每个帖子的书签状态-这会产生N+1查询,一般来说这是一个可怕的想法 获取当前页面的帖子id列表,获取当前用户的所有书签,其中当前页面的帖子id中的可书签的帖子id,检查可书签列表中存在的帖子,并基于此显示书签状态 这第二个是相

我有一个应用程序,用户可以在其中为帖子添加书签。为了处理书签,我创建了一个名为
Bookmark
的多态模型

现在我需要显示所有帖子的列表(比如每页50篇,分页),其中包含当前登录用户的标题和书签状态

我脑子里有两种情况,我怎样才能做到这一点。我一个都不喜欢

  • 在呈现列表时,检查每个帖子的书签状态-这会产生N+1查询,一般来说这是一个可怕的想法
  • 获取当前页面的帖子id列表,获取当前用户的所有书签,其中
    当前页面的帖子id中的可书签的帖子id
    ,检查可书签列表中存在的帖子,并基于此显示书签状态

  • 这第二个是相当合理的,但我真的希望将其合并到一个SQL查询中(如果可能,我不确定是否可以使用
    连接来实现)。这是因为,事实上,我不是在常规rails视图中使用它,而是在GraphQLAPI端点+SPA应用程序中使用它,获取集合ID并比较它们并不是那么简单。它只会导致对api的请求量增加,这是我希望避免的。

    事实证明,我可以使用
    includes
    方法来实现这一点(这将产生两个查询,但仍然优于N+1)。如果有人可以与
    joins
    共享一个查询版本,我将非常乐意接受它的答案,但是,到目前为止,我发布的解决方案足以满足我的需要

    class User
      has_many :bookmarks, as: :bookmarker
    end
    
    class Post
      has_many :bookmarks_as_bookmarkable, as: :bookmarkable, class_name: :Bookmark
    
      def bookmarked_by?(bookmarker)
        self.bookmarks_as_bookmarkable.to_a.select do |b|
          b.bookmarker_type == bookmarker.class.name &&
          b.bookmarker_id   == bookmarker.id
        end.any?
      end
    end
    
    结果是:

    Post.includes(:bookmarks_as_bookmarkable).map { |p| u.bookmarked_by?(current_user) }`  
    # SELECT "posts".* FROM "posts"
    # SELECT "bookmarks".* FROM "bookmarks" WHERE "bookmarks"."bookmarkable_type" = ? AND "bookmarks"."bookmarkable_id" IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)
    #
    # => [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true]