2016-07-09 7 views
2

Ich habe ein Feld als json Spalte und ich muss alle Telefonwerte innerhalb dieser Spalte suchen, ich habe gesucht und ich habe kein Dokument mit ransack gefunden. Ist es möglich, Ransaack zu verwenden, um JSON-Spalte zu suchen? Ich habe die ransack verwendet, um andere Felder zu suchen, so habe ich ransack oder etwas verwenden, die sowohl Ergebnisrails racks gem zu suchen json Spalte

wie diese

meine Json Spalte

sieht
{"phone1"=>"", "relationship_type1"=>"", "relationship_name1"=>"", "phone2"=>"", "relationship_type2"=>"", "relationship_name2"=>"", "phone3"=>"", "relationship_type3"=>"", "relationship_name3"=>"", "phone4"=>"", "relationship_type4"=>"", "relationship_name4"=>""} 

phone1 kombinieren kann, sollte phone2,3,4 sein suchbar.

Antwort

1

Siehe Ransack wiki

Für jede JSON Spalte hinzufügen eine dieser zu Ihrem Modell, und es wird Ihre JSON Spalte ermöglichen, als normale Spalten geplündert werden:

ransacker :phone1 do |parent| Arel::Nodes::InfixOperation.new('->', parent.table[:json_column], 'phone1') end

0

Die obige Antwort ist korrekt, außer dass Arel 6+ eine Ausnahme auslöst, wenn Sie nur eine Zeichenfolge für den letzten Arg senden, müssen Sie in diesem Beispiel Arel::Nodes::build_quoted('phone1') anstelle von 'phone1 verwenden

Auch habe ich festgestellt, dass, wenn Sie eine ransacker auf dem Modell verwenden, müssen Sie es mit Model.search anstelle von Model.ransack aufrufen, es kann eine Ausnahme sein, aber mit Model.search ist, was für mich arbeitete.

#search nimmt einen Hash-Wert des Ransacker Sie mit dem Prädikat hinzugefügt verwenden werden Sie mit (zB phone1_cont oder phone1_eq)

So, um die oben genannten Arbeiten zu machen arbeiten müssen Sie würden Model.search({phone1_cont: "555"})

nennen