【问题标题】:Search query in jsonb column在 jsonb 列中搜索查询
【发布时间】:2021-11-04 23:12:23
【问题描述】:

我有一个 stage 表,其中有一个名为 titlejsonb 列。

title 的值是一个红宝石 hash 值,例如{en: "A", de: "A" }

现在我编写了以下范围,用于根据 Rails 模型中的标题搜索stage

scope :search, ->(query) { where('title @> ?', { "#{I18n.locale}": "%#{query}%" }.to_json).any? }

但它不起作用,它给了我 RSpec 测试中的所有项目。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql jsonb


    【解决方案1】:

    您需要将->> JSON 运算符与ILIKE 一起使用来进行模式匹配:

    scope :search, ->(query) {
      where("title->>'#{I18n.locale}' ILIKE ?", "%#{query}%")
    }
    

    【讨论】:

    • 但我收到此错误消息ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for #<Arel::Nodes::Count:0x00005578ffa1a3b0>) in: title->>en ILIKE ?
    • @kia 啊,我不应该将字符串包装在 Arel.sql 中。已编辑。
    • 现在我收到了这个错误ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "en" does not exist LINE 1: SELECT "stages".* FROM "stages" WHERE (title->>en ILIKE '%A1...,因为我在后端访问title,就像这样-> title[:en]
    • 对不起。密钥名称需要引用title->>'en' ILIKE ?sqlfiddle.com/#!17/58944b/5
    • 另外,我们应该使用 sanitize_sql 编写 SQL 查询,以便从 brakeman 传递
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多