2012-05-18 16 views
7

Mam tabelę wydatków. Ma kolumnę invoice_id.Testowanie zakresów szyn dla zer

Chciałbym 2 zakresy - jeden dla rozliczanych wydatków i jeden dla nie rozliczanych. Pomyślałem, że mogę po prostu przetestować, czy wartość invoice_id była zerowa.

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

Ale to nie działa.

Wszelkie pomysły?

Dzięki!

Odpowiedz

12

Na pierwszym z nich trzeba użyć skrótu składnię:

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

Druga wymaga użycia surowego sql:

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

Można też skoczyć do AREL za drugim aby uniknąć pisania surowego sql, ale jest to zaawansowany temat i może okazać się mniej czytelny niż raw sql.

Korzystanie bezpośredni równości nie będzie działać, ponieważ te wyrażenia są oceniane natychmiast i są włączone do ich logicznych odpowiedników, ponieważ są zaangażowane żadne zmienne, więc będą one interpretowane jako

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

Zmieniłem to na Twoją sugestię. Ale używając '<% @ expenses.billed.each do | expense | %> '- Otrzymuję niezdefiniowaną metodę' notbilled 'dla # Reddirt

+0

Dlaczego wywoływanie 'billed' powodowało błąd dotyczący' notbilled'? Zakresy nie są przeznaczone dla tablic - są one przeznaczone dla relacji. '@ koszty' to zestaw wyników zapytania, więc czas na wywołanie zasięgu na nim już minął. – x1a4

+0

Przepraszam, patrzyłem na drugi indeks. To z tego stwierdzenia. <% @ expenses.notbilled.each do | expense | %> – Reddirt