我有一个带有范围列的模型
#<JobRequirement id: 1, age: 18...30>
如何使用age: 20
获取JobRequirement
就像这样
JobRequirement.where(age: 20)
发布于 2018-07-29 02:48:24
我认为您需要在字符串中使用PostgreSQL range operators和一些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-range:
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))
https://stackoverflow.com/questions/51573800
复制相似问题