2016-07-14 6 views

Antwort

0

Nun, ich habe ziemlich viel Weg gefunden, dies mit Arrays zu tun (nicht sicher, ob json enthält für Hash in MySQL). Zuerst um diesen Code in Ihrer aktiven Datensatz Modell:

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 

Dazu Klasse unter der Annahme Shirt mit Spalte size, dann können Sie wie folgt vorgehen:

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

Es funktioniert wie folgt: Es wird überprüft, dass die Das in der JSON-Spalte gespeicherte Array enthält alle Elemente des angeforderten Arrays, indem das Ergebnis jedes JSON-Containers einzeln abgerufen, dann alle multipliziert und mit dem Vergleichselement 1 verglichen wird. Sie können dasselbe mit OR tun, indem Sie bitweise ODER statt Multiplikation.

Verwandte Themen