Rails 5 现在支持 MySQL 中的原生 JSON 数据类型,所以如果我有一个包含数组的列data["a", "b", "c"]
: ,并且我想搜索该列是否包含值,所以基本上我想要类似的东西:data_json_cont: ["b"]
。那么这个查询可以使用 ransack 构建吗?
user1011792
问问题
908 次
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
然后假设你有Shirt
column类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 回答