如何检查一个数字是否在activerecord范围内?
我有一个带范围列的模型
#
如何使用age: 20
来获得JobRequirement
?
就像是
JobRequirement.where(age: 20)
我认为你需要在字符串中使用PostgreSQL范围运算符和一些SQL。 特别是,你想要@>
(包含元素)运算符:
JobRequirement.where('age @> ?', 20)
至于提供作为占位符值的范围:
JobRequirement.where('age <@ ?', 18..20)
你会发现AR对PostgreSQL范围类型的了解有些限制。 当您提供范围作为占位符的值时,AR会希望将范围扩展为以逗号分隔的列表,因为它假定您说的是where('col in (?)', 18..20)
所以你最后得到的废话如下:
where age <@ 18,19,20
在生成的SQL中。 你可以通过手动输入值来解决这个问题。 例如:
> ActiveRecord::Base.connection.type_cast(6..11) => "[6,11]" > ActiveRecord::Base.connection.type_cast(6...11) => "[6,11)"
然后将字符串发送到PostgreSQL应自动将其转换为PostgreSQL范围的查询中:
JobRequirement.where('age <@ ?', ActiveRecord::Base.connection.type_cast(18..20))
根据您执行此操作的位置, connection
方法可能具有所有噪声:
JobRequirement.where('age <@ ?', connection.type_cast(18..20))
如果PostgreSQL没有自己选择正确版本的<@
运算符,那么你可以通过更多类型转换来帮助它:
JobRequirement.where('age <@ ?::int4range', connection.type_cast(18..20))