如何检查一个数字是否在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))