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 调用中手动创建别名。
我在 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 调用中手动创建别名。