You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:42:00