rails sql 查找属性差异大于阈值的与自身相关的模型

rails sql find models related to self with attribute difference greater than threshold

我在 rails 中有一个与自身相关的 Person 模型:

class Person < ApplicationRecord
  has_many :children,
    class_name: "Person",
    foreign_key: :person_id

  belongs_to :mother,
    class_name: "Person",
    foreign_key: :person_id
end

人们还有一个 age 属性来表示他们的年龄(以年为单位)。我想要一个 ActiveRecord 或 SQL 查询来查找所有 child-to-mother 年龄差异大于或等于 50 岁的人。

(这里的模型名称不是我在我的应用程序中真正使用的名称。我重命名它以简化问题描述。但是,对于我的实际查询,我需要知道 absolute年龄差的值大于等于50岁。显然children不可能比他们的妈妈大所以类比不成立。)

我尝试了以下几种变体,但都崩溃了:

    Person
      .includes(:mother)
      .where("ABS(persons.age - (SELECT age FROM persons WHERE (id = persons.person_id))) >= 50")

这个结果特别提示:

HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

起初我认为也许最新的 SQL 查询的 where 子句返回某种年龄列表而不仅仅是母亲的年龄,所以我尝试使用 [1] 在它之后获取(应该是)单个元素数组的第一个元素(如果我的假设是正确的)。它不正确 - SQL 错误随后更新,让我知道我无法下标不是数组的内容。

我正在寻找最简单的解决方案。任何帮助表示赞赏。谢谢!

无法对此进行测试,但我相信 reails 会即时为您生成别名。

尝试

Person
      .includes(:mother)
      .where("ABS(persons.age - (SELECT age FROM mothers_persons)) >= 50")

一般是关联名称的复数形式,下划线,table名称(所以如果用户有员工,用户员工的关联table(别名)称为employees_users

如果上述方法不起作用,您需要在 SQL 调用中手动创建别名。