2009-09-26 19 views
22

Quando si esegue una ricerca nel record attivo, cerco record che non abbiano un bit archiviato impostato su true.condizioni di ricerca activerecord - ricerca di null o false

Alcuni dei bit archiviati sono nulli (che non sono archiviati) altri hanno archiviato impostato su falso.

Ovviamente,

Project.all(:conditions => {:archived => false}) 

trova i progetti con i bit archiviati con valori nulli. Come possono essere selezionati tutti i progetti non archiviati con record attivo?

risposta

16

Prova questa (in Rails 2):

Project.all(:conditions => ['archived IS NULL OR archived = ?', false]) 

Questa è una limitazione di vecchie versioni di Rails, come spiegato qui: https://rails.lighthouseapp.com/projects/8994/tickets/1181-ar-find-producing-null-when-it-should-be-is-null

+0

Ron - Ricevo il seguente messaggio di errore da SQLite quando faccio come suggerito. SQLite3 :: SQLException: nessuna colonna di questo tipo: FALSE: SELECT * FROM "review_phases" WHERE (chiuso IS NULL OPPURE chiuso = FALSE) LIMIT 20 OFFSET 0 Potrebbe essere che SQLite gestisca in modo diverso i booleani rendendo questo non funzionante? – metasoarous

0

@metasoarous

Prova:

Project.all(:conditions => "archived IS NULL OR archived = 'F'") 
0

Se si desidera essere indipendenti dal database, è possibile farlo in Rails 3:

Project.where("archived IS NULL OR archived = #{ActiveRecord::Base.connection.quoted_false}") 
+1

@ La risposta di SeanLazer in basso funziona in Rails 3.0.9 e sembra un po 'più pulita. – John

6

Il database modo agnostico corretto per farlo è:

Project.where("archived IS NULL OR archived = ?", false) 
+0

Grazie! Funziona su SQLite e Postgres. E solo una nota, se pensi che questo non funzioni, ricontrolla che i valori nel tuo DB ** sono ** falsi e non Null. Mi avrebbe salvato un po 'di confusione. – John

74

Rails 4 (forse anche prima) supporta:

Project.where(archived: [false, nil]) 

... che è abbastanza conciso.

+1

Lavori in Rails 3.2.14 – Trip

+1

scoperto anche questo funziona (un po 'fuori tema, ma un altro modo di utilizzare null: Project.where (archiviati: VALID_VALUES + [nil]) come ... Project.where (linkage: account.project_codes.map (&: id) + [nil]) – TJChambers

+1

Questa dovrebbe essere la risposta accettata. –

Problemi correlati