如何不使用迭代器查找符合属性条件的Stock模型对象?
解决Stock模型根据ticker包含特定字符串查询的问题
嘿,我懂你碰到的问题了——你把Ruby的include?方法直接写到SQL查询语句里啦,数据库可看不懂这种Ruby语法哦😉
为什么你之前的写法没用?
Stock.where("ticker.include?(?)", 'at') 这个写法的问题在于:where方法的第一个参数是SQL片段,不是Ruby代码。数据库无法识别Ruby的include?方法,所以这个查询会被判定为无效SQL,自然查不到结果。
正确的查询方式
下面几种方法都是直接在数据库层面执行匹配,不会把所有Stock对象加载到内存遍历,完全符合你的需求:
基础SQL LIKE查询(兼容绝大多数数据库):
Stock.where("ticker LIKE ?", "%at%")这里的
%是SQL的通配符,%at%表示匹配任意包含at的字符串(前后可以有任意字符)。Rails Arel写法(更优雅,自动适配数据库):
如果你用的是Rails 5及以上版本,推荐用Arel来构建查询,不用写原始SQL,还能自动处理不同数据库的语法差异:Stock.where(Stock.arel_table[:ticker].matches("%at%"))不区分大小写的查询(针对PostgreSQL):
如果你需要忽略大小写匹配(比如匹配AT、At、aT、at),PostgreSQL支持ILIKE:Stock.where("ticker ILIKE ?", "%at%")
这些方法都会直接让数据库执行筛选,效率比加载所有对象再用Ruby枚举器遍历高得多,而且完全符合你的要求~
内容的提问来源于stack exchange,提问作者marcamillion
相关产品推荐
相关产品推荐

