gpt4 book ai didi

mysql - 如何使用 ransack 在 Rails 5 中搜索 MySQL JSON 数组

转载 作者:行者123 更新时间:2023-11-30 22:15:39 28 4
gpt4 key购买 nike

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

最佳答案

好吧,我找到了很多方法来使用数组(不确定 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 类和 size 列,那么您可以执行以下操作:

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

它的工作原理如下:它检查存储在 json 列中的数组是否包含所询问数组的所有元素,方法是单独获取每个 json 包含的结果,然后将它们全部相乘,并将它们与 arel predicate eq 与 1 进行比较:) 您可以对 OR 执行相同的操作,方法是使用按位 OR 而不是乘法。

关于mysql - 如何使用 ransack 在 Rails 5 中搜索 MySQL JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38383723/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com