2016-07-14 67 views
1

Rails 5はMySQLでネイティブなJSONデータ型をサポートするようになりましたので、データには["a", "b", "c"]というデータがあり、値が入っていますので、基本的にはdata_json_cont: ["b"]のようにしたいと思います。では、このクエリはransackを使って構築できますか?ransackを使用してRails 5でMySQL JSON配列を検索する方法

答えて

0

まあ、私は配列でこれを行うためのかなりの方法を見つけました(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。

関連する問題