【问题标题】:Rails filter associated records [duplicate]Rails过滤关联记录[重复]
【发布时间】: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


【解决方案1】:

不幸的是,这个问题没有优雅的解决方案。可以预加载与静态过滤器的关联,例如:

User.eager_load(:popular_comments)

但它不适用于动态文件管理器。

你可以在这里找到关于预加载 Rails 关联的优秀文章http://blog.arkency.com/2013/12/rails4-preloading/

【讨论】:

  • 好吧,作者说“当我们只在运行时知道我们想要应用的关联条件时,我们应该怎么做?老实说,我不知道。如果你发现请在 cmets 中告诉我出来。”这正是我的情况......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2011-04-22
  • 1970-01-01
  • 2020-02-18
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多