【问题标题】:How to use ransack to search MySQL JSON array in Rails 5如何在 Rails 5 中使用 ransack 搜索 MySQL JSON 数组
【发布时间】:2016-11-17 22:23:15
【问题描述】:

Rails 5 现在支持 MySQL 中的原生 JSON 数据类型,所以如果我有一列 data 包含一个数组:["a", "b", "c"],并且我想搜索该列是否包含值,所以基本上我想要类似的东西:data_json_cont: ["b"]。那么这个查询可以使用 ransack 构建吗?

【问题讨论】:

    标签: mysql ruby-on-rails ransack mysql-json


    【解决方案1】:

    好吧,我找到了很多方法来使用数组(不确定 json 包含用于 mysq 中的哈希)。首先将此代码包含在您的活动记录模型中:

    self.columns.select{|column| column.type == :json}.each do |column|
          ransacker "#{column.name}_json_contains".to_sym,
          args: [:parent, :ransacker_args] do |parent, args|
            query_parts = args.map do |val|
                "JSON_CONTAINS(#{column.name}, '#{val.to_json}')"
            end
            query = query_parts.join(" * ")
            Arel.sql(query)
          end
    
    end
    

    然后假设您有 Shirtsize 的类,那么您可以执行以下操作:

    search = Shirt.ransack(
      c: [{
        a: {
          '0' => {
            name: 'size_json_contains',
            ransacker_args: ["L", "XL"]
          }
        },
        p: 'eq',
        v: [1]
      }]
    )
    search.result
    

    它的工作原理如下:它检查存储在 json 列中的数组是否包含请求数组的所有元素,方法是单独获取每个 json 包含的结果,然后将它们全部相乘,并将它们与 arel 谓词 eq 与 1 进行比较:) 你可以用 OR 来做同样的事情,通过使用按位 OR 而不是乘法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多