1

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

4

1 回答 1

0

好吧,我找到了相当多的方法来使用 Arrays(不确定 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

然后假设你有Shirtcolumn类size,那么你可以执行以下操作:

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 而不是乘法。

于 2016-07-15T00:27:09.853 回答