Rails模型中stage表jsonb类型title字段搜索scope返回全量数据问题
问题修复方案
原代码问题原因
- 误用JSONB的
@>包含操作符:该操作符仅做精确结构匹配,不会识别%作为SQL通配符,只有对应语言的title值完全等于%#{query}%字符串时才会命中,模糊匹配逻辑完全不生效。 - scope末尾多余调用了
.any?:该方法会立即执行查询返回布尔值,而非可链式调用的ActiveRecord查询关系。当查询命中任意记录时.any?返回true,后续将该返回值作为查询条件使用时会等价于无过滤条件,最终返回全表记录。
修复后的代码
改用->>操作符取出对应语言的文本值,再通过ILIKE做模糊匹配,同时删除末尾的.any?:
scope :search, ->(query) { where("title ->> ? ILIKE ?", I18n.locale.to_s, "%#{query}%") }
如果需要区分大小写匹配,把ILIKE替换为LIKE即可。
可选的Arel写法(避免硬编码SQL片段)
如果希望代码更适配Rails的ORM规范,可使用Arel构造查询:
scope :search, ->(query) { arel_title = Stage.arel_table[:title] where(arel_title.getitem(I18n.locale.to_s).matches("%#{query}%")) }
内容的提问来源于stack exchange,提问作者kia
相关产品推荐
相关产品推荐

