2012-06-09 15 views
9

sto usando Rails 3.2 e ho ottenuto una tabella del database in cui voglio trovare tutte le righe che corrispondono ai seguenti criteri:O & ed in Rails ActiveRecord clausola where

a = vero e b = true e (0 c < 1 o d = 1), a, b, c, d sono colonne.

Posso avere qualcosa di simile:

Route.where(:a => true, 
      :b => true, 
      :c => 0..1 OR :d=1 
      ).all   
+0

Date un'occhiata a http://stackoverflow.com/questions/3548548/rails3 -combine-scope-with-o –

+0

Dai uno sguardo a questo screencast http://railscasts.com/episodes/354-squeel – mohamagdy

risposta

12

Posso sbagliarmi, ma non credo che si possa formare la query utilizzando l'Arel-based in cui la funzione; avresti bisogno di formare da solo la stringa di query del database.

Supponendo che si sta utilizzando SQLite o Postgres:

Route.where("a = true and b = true and ((c > 0 and c < 1) or d = 1)").all 

non ho ancora testato questo codice, ma ho il sospetto che potrebbe fare il lavoro per voi. Si noti che questo è un codice meno "portatile"; se cambi il database che stai usando, la query potrebbe interrompersi.

+3

'where ('a =: true eb =: true e ((c>: lo e c <: hi) or d =: d ',: true => true,: lo => 0,: hi => 1,: d => 1) 'sarebbe più sicuro, diversi database usano cose diverse per" true " O anche '.where (: a => true,: b => true) .where ('c>: lo e c <: hi) o d =: d ', ...) '. –

2

Penso che Rob abbia ragione su Arel che non supporta ancora O. Da arel site:

L'operatore OR non è ancora supportato. Funzionerà così:

users.where(users[:name].eq('bob').or(users[:age].lt(25))) 

L'operatore AND si comporterà allo stesso modo.

+0

Sono molto nuovo usando il sito. Imparare come utilizzare il sito. Ho appena cliccato su. Non so ancora come "accettare". – pepe

+0

Scusa, ti avevo confuso con l'autore della domanda originale. –

9

In Rails 4 si può anche fare

Route.where(:a => true,:b => true,:c => [1,2]).all

Questa troveranno dove c è 1 o 2.

+0

È richiesto tutto? Penso che sia di default. – learner

+0

Sì. Non è richiesto, lo stavo solo mantenendo coerente con la domanda. – user2031423