1
Rails 5はMySQLでネイティブなJSONデータ型をサポートするようになりましたので、データには["a", "b", "c"]
というデータがあり、値が入っていますので、基本的にはdata_json_cont: ["b"]
のようにしたいと思います。では、このクエリはransackを使って構築できますか?ransackを使用してRails 5でMySQL JSON配列を検索する方法
Rails 5はMySQLでネイティブなJSONデータ型をサポートするようになりましたので、データには["a", "b", "c"]
というデータがあり、値が入っていますので、基本的にはdata_json_cont: ["b"]
のようにしたいと思います。では、このクエリはransackを使って構築できますか?ransackを使用してRails 5でMySQL JSON配列を検索する方法
まあ、私は配列でこれを行うためのかなりの方法を見つけました(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
その後、あなたは次の操作を行うことができ、あなたが列size
持つクラスShirt
を持っていると仮定すると:
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。