Rails使用Arel构建BETWEEN查询报undefined method `and'错误如何解决
问题解决方法
报错原因
你遇到的报错是因为Arel::Attributes::Attribute(也就是你取的arel_table[:minimum]实例)本身没有and方法,该方法是Arel条件节点的组合方法,不可用于构造BETWEEN的边界范围。Arel::Nodes::Between的第二个入参要求传入Arel::Nodes::Range类型的实例来定义上下边界,而非直接调用and方法拼接。
正确实现代码
写法1:显式构造Between节点(适配复杂多表关联场景)
MyModel.where( Arel::Nodes::Between.new( Arel::Nodes::Quoted.new(my_variable), # 将自定义变量包装为Arel可识别的字面量节点 Arel::Nodes::Range.new( MyModel.arel_table[:minimum], MyModel.arel_table[:maximum] ) ) )
写法2:使用Arel内置辅助方法(更简洁)
MyModel.where( Arel::Nodes::Quoted.new(my_variable).between( MyModel.arel_table[:minimum]..MyModel.arel_table[:maximum] ) )
简单场景备选写法(无复杂关联时可直接使用)
如果没有复杂的多表关联逻辑,也可以直接用占位符写法,代码更易读:
MyModel.where("? BETWEEN minimum AND maximum", my_variable)
以上写法最终生成的SQL都和你需要的目标逻辑完全一致。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

