【发布时间】:2017-08-21 11:50:19
【问题描述】:
我有帖子和评论模型 发布 has_many :commetns 评论belongs_to :post 我想从某个用户那里检索所有带有 cmets 的帖子。 (所以我想获取每一个帖子(即使是那些没有 cmets 的帖子),并过滤掉某些用户创建的 cmets)
目前我已经尝试过:
Post.all.includes(:comments).where('comments.post_id IS NULL OR comments.user_id = ?' id).references(:comments)
它将 Posts cmets 过滤为我想要的 cmets,但如果 Post 除了过滤掉的 cmets 之外没有其他 cmets,它不会返回此帖子(显然它被 where 子句拒绝...)
或者
Post.all.joins('LEFT JOIN comments c ON c.post_id = posts.id AND c.user_id = ' + sanitize(id))
它返回所有帖子,但过滤掉不起作用......
【问题讨论】:
-
你的问题现在很不清楚,因为现在它说你想要所有
Posts,然后被comments.user_id过滤,但是你抱怨Posts 被过滤掉了。您的预期结果是Posts 带有来自某个用户的 cmets 和所有Posts 没有 cmets 还是所有Posts 并且只有来自某个User的 cmets? -
我想要所有帖子,我想过滤掉 cmets,而不是帖子。所以所有帖子,只有来自某个用户的 cmets
-
我不确定这可以在单个方法链中完成,因为它涉及实例级别的详细信息,例如(post.cmets.user_id) 这通常意味着它不能被预加载。加载所有帖子然后加载所有用户 cmets 并在代码中处理它可能更容易。
-
能否展示第二个查询生成的 SQL 是什么?
-
@TemaBolshakov 生成的 SQL 很简单,但问题是 cmets 不会被预先加载或缓存,因此当您遍历 post cmets 时,它将有 2 个问题 1) n + 1 2) 将不保留 user_id 过滤器,因此将返回所有 cmets。第二个可以通过
post.comments.where(user_id: id)解决,但在这种情况下,前者不能通过急切加载的关联来解决
标签: ruby-on-rails ruby join activerecord