2012-05-18 29 views
7

Ho una tabella delle spese. Ha una colonna invoice_id.Test delle rotaie per nil

Vorrei 2 ambiti: uno per le spese fatturate e uno per non fatturato. Pensavo di poter testare per vedere se invoice_id era zero.

scope :notbilled, where(:invoice_id == nil) 
scope :billed, where(:invoice_id != nil) 

Ma, questo non funziona.

Qualche idea?

Grazie!

risposta

12

Per il primo, è necessario utilizzare la sintassi hash:

scope :notbilled, where(:invoice_id => nil) 

Il secondo richiede di utilizzare SQL prime:

scope :billed, where('invoice_id is not null') 

Si può anche saltare giù nella AREL per il secondo per evitare di scrivere sql raw, ma questo è un argomento avanzato e risulterebbe meno leggibile rispetto al raw sql.

Utilizzando l'uguaglianza diretta non funziona, perché queste espressioni vengono valutate immediatamente, e si trasformano in loro equivalenti booleani perché nessuna variabile sono coinvolti, in modo che sarebbe essere interpretati come

scope :notbilled, where(false) 
scope :billed, where(true) 
+0

L'ho modificato secondo i vostri suggerimenti. Ma, usando '<% @ costs.billed.each do | spending | %> '- Ricevo un metodo non definito' notbilled 'per # Reddirt

+0

Perché chiamare 'billed' produce un errore su' notbilled'? Gli ambiti non sono pensati per gli array: sono per le relazioni. '@ spese' è il set di risultati di una query, quindi è già trascorso il tempo di richiamare un ambito su di esso. – x1a4

+0

Mi dispiace, stavo guardando il secondo indice. È da questa affermazione. <% @ costs.notbilled.each do | expense | %> – Reddirt

Problemi correlati