gpt4 book ai didi

ruby-on-rails - 如何检查一个数字是否在 activerecord 的范围内?

转载 作者:行者123 更新时间:2023-11-29 14:31:14 25 4
gpt4 key购买 nike

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

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

如何使用 age: 20 获取 JobRequirement

有点像

JobRequirement.where(age: 20)

最佳答案

我认为您需要使用 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 范围的查询中:

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))

关于ruby-on-rails - 如何检查一个数字是否在 activerecord 的范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51573800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com