【问题标题】:Rails scope for records with childrenRails 记录有孩子的范围
【发布时间】:2018-02-16 07:19:51
【问题描述】:

有没有一种简单易行的方法来拥有这样的东西?

class People < ActiveRecord::Base
  has_many :babies
  scope :with_babies -> { where(babies.count > 0) }
end

关于 SO 有很多类似的问题,但它们都求助于复杂的独特 SQL 语句。有没有一种简单的 Rails 方法可以做到这一点?

【问题讨论】:

  • 这样的?范围:with_babies, lambda {where(babies.count > 0)}
  • 我向你推荐这个非常有用的 gem:github.com/MaxLap/activerecord_where_assoc 它可以让你做People.where_assoc_exists(:babies, babies: { sex: :male }) 之类的事情等等

标签: sql ruby-on-rails activerecord


【解决方案1】:

您可以使用 SQL 连接 + 独特性作为一种简单的方法。如果您将来希望基于此进行不明确的查询,它可能会引入问题,但我认为这种情况不会经常发生,所以这应该让您开始。它确实提供了比添加自定义 SQL 更好的可读性。

scope :with_babies, -> { joins(:babies).distinct }

【讨论】:

  • 这就是我要找的东西,干杯。澄清一下,.distinct 是否会阻止出现 People 的多个记录(每个婴儿一个)?
  • join 本身不会修改SELECT 中包含的列。而且由于只查询来自People 模型的列,distinct 将过滤掉重复记录。您可能想通过.includes 尝试使用预加载的查询,不过,我刚刚意识到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多