2012-04-09 7 views
0

Ich habe einen Hash mit booleansWie übergibt man einen Hash als Abfrage mit "OR-Join"?

({"u25" => true, "f26t49" => true, "o50" => true, ..}); 

alles in allem gibt es 19 booleans und ich möchte diese mit einem Tisch in meinem db überprüfen und diese Datensätze zu erhalten, wie mindestens ein Spiel haben. Ich hatte es versuchen, mit

"Model.all (: conditions => hash)" oder "Model.where (hash)"

aber bekomme ich die Abfrage

“..u25 == wahr UND f26t49 == true UND O50 == true ... "

aber ich so etwas wie dieses brauchen:

" ..u25 == true ODER f26t49 == true ...“

Ich hoffe du könntest mir helfen!

ADDITION:

Ich habe versucht eine Abhilfe zu machen und eine Abfrage-String aus dem Hash zu erzeugen. Wenn ich diese Zeichenfolge direkt schreiben (m = Model.where ("u25 == 't'")) es funktioniert, aber wenn ich einen varaible

@query = '"u25 == ' + "'t'" + '"' 

m = Model.where(@query) 

als m ist null passieren!

+0

Sind diese Bedingungen immer wahr? Wenn ja, dann brauchst du nur ein Array wie [u25, f26t49, ...], oder? – Ashitaka

Antwort

1

Ich denke, dass Ihr Workaround Sie in die richtige Richtung bringt. Hier ist, was ich tun würde:

# model.rb 
def self.search_with_conditions(hash) 
    query = hash.map{|k,v| "#{k} == #{v}"}.join(' OR ') 
    where(query) 
end 

Und dann in Ihrem Controller, rufen Sie einfach an:

m = Model.search_with_conditions(hash) 

Nebenbei bemerkt: Dies könnte für einige DBs arbeiten und nicht für andere als eine Verwendung 1 als Wert für wahr . Außerdem hatte ich keine Zeit, dies zu versuchen, so dass mir in diesem Zustand einige Anführungszeichen fehlen. Ich denke, es könnte '#{v}' sein.

EDIT: Nach einem wenig mehr über Rails zu lernen, ich einen Haftungsausschluss hier hinzufügen:

Wenn die Saiten k oder v sind Teil einer Benutzereingabe, ist dieser Ansatz für SQL-Injection anfällig ist. Verwenden Sie diese Methode mit Vorsicht.

+0

Vielen Dank! Es ist nicht perfekt, aber es funktioniert! Ich habe die # {v} in 't' für sqlite bzw. '1' für mysql geändert (habe sie noch nicht für mysql getestet) – kampfsau1808

+0

Wenn du immer nachprüfst, ob diese Bedingungen zutreffen, solltest du wahrscheinlich ein Array anstelle von verwenden ein Hashwert. Und da Sie nur die Schlüssel des Hashs und nicht die Werte verwenden, können Sie '| k, v |' für '| k |' verwenden. Funktioniert in diesem Fall genauso. Und akzeptiere meine Antwort, wenn du kannst. – Ashitaka

Verwandte Themen