Rails中如何用模型方法查询PostgreSQL numrange列包含指定值
解决Rails中PostgreSQL numrange列的包含查询问题
你需要利用PostgreSQL的@>操作符来判断值是否存在于numrange范围内,而非用等于单值范围的方式。以下是几种正确的实现方式:
方法1:直接使用SQL片段(简单直接)
PricingInfo.where(id: params[:id]).where('denomination @> ?', params[:denomination].to_f)
这段代码会生成符合你期望的SQL逻辑:
SELECT "pricing_infos".* FROM "pricing_infos" WHERE "pricing_infos"."id" = $1 AND denomination @> $2
Rails会自动处理参数绑定,避免SQL注入风险。
方法2:用Arel构建查询(更贴合Rails ORM风格)
如果不想硬写SQL片段,可以用Arel生成操作符:
denomination_col = PricingInfo.arel_table[:denomination] PricingInfo.where(id: params[:id]).where(denomination_col.op('@>', params[:denomination].to_f))
Arel会帮你正确生成带有@>操作符的查询,同时保持参数绑定的安全性。
方法3:封装模型方法(方便复用)
如果这个查询会多次用到,建议在模型里封装类方法:
class PricingInfo < ApplicationRecord def self.includes_denomination(value) where('denomination @> ?', value.to_f) end end # 调用示例 PricingInfo.where(id: params[:id]).includes_denomination(params[:denomination])
原代码问题说明
你之前写的denomination: params[:denomination]..params[:denomination]会让Rails把Ruby范围转换成[x.x,x.x]格式的numrange字符串,执行的是等于判断,而非判断值是否被范围包含,这和你需要的逻辑不符。
内容的提问来源于stack exchange,提问作者Divya Tiwari
相关产品推荐
相关产品推荐

