2012-07-04 13 views
5

Piszę zakres, który powinien powiedzieć wybierz wszystkie połączenia, w których call_status = open i unit_id nie jest zerowy. Jestem bardzo słaba w stosunku do Ruby, a także nowa w Railsach i mam trudności z wyrażeniem tego prawa.Zakres railsów, gdzie nie jest równy

Oto co mam:

scope :open_calls, where(:call_status => "open", :unit_id != nil).order("id ASC") 

powinienem być przy użyciu innego operatora do oceny zero?

+0

Tak. Nie znam innego sposobu robienia tego niż gdzie ("call_status =? I NOT unit_id IS NULL", "open"). Może być lepszy sposób? –

+1

Nie używaj takich zakresów. Użyj tego z lambdas, na wszelki wypadek. – Hauleth

Odpowiedz

8

O ile mi wiadomo, nie ma sposobu, aby powiedzieć ActiveRecord, aby zbudował klauzulę NULL z hashem. Ale można łańcuch string-styl i hash stylu gdzie klauzule:

scope :open_calls, where(:call_status => "open").where("unit_id IS NOT NULL").order("id ASC") 
+0

Dzięki, robiłem wcześniej wcześniejszy łańcuch i zadziałało, ale starałem się zrobić to wszystko w jednym hasza. Doceń twoją pomoc, na razie trzymam się łańcuchów. – nulltek

+1

Z Railsami 4 możesz również użyć 'where.not (unit_id: nil)'. – irbanana

0

Można to zrobić:

scope :open_calls, where("call_status IS ? AND unit_id IS NOT ?", "open", nil).order("id ASC") 

Zauważ, że wartości "open" i nil są umieszczane w tablicy i używamy ?, aby je wstawić. Pomaga to zapobiegać błędom SQL injection spowodowanym cytowaniem/ucieczką itp. I jest zdecydowanie zalecane. See here for more.

Powiązane problemy