首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查一个数字是否在activerecord的范围内?

如何检查一个数字是否在activerecord的范围内?
EN

Stack Overflow用户
提问于 2018-07-29 01:44:29
回答 1查看 1.4K关注 0票数 0

我有一个带有范围列的模型

#<JobRequirement id: 1, age: 18...30>

如何使用age: 20获取JobRequirement

就像这样

JobRequirement.where(age: 20)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51573800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档