2012-07-04 24 views
5

Estoy escribiendo un ámbito que debe decir seleccionar todas las llamadas donde call_status = open y unit_id no es nulo. Soy muy débil con Ruby y también soy nuevo en Rails y estoy teniendo dificultades para expresar este derecho.Raíles alcance donde no es igual a

Aquí lo que tengo:

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

¿Debo utilizar un operador diferente para evaluar nula?

+0

Sí. No conozco otra forma de hacer esto que donde ("call_status =? AND NOT unit_id IS NULL", "open"). Puede haber una mejor manera? –

+1

No use ámbitos como este. Úselo con lambdas, por las dudas. – Hauleth

Respuesta

8

Por lo que sé, no hay forma de decirle a ActiveRecord que cree una cláusula NULL con un hash. Pero se puede cadena de cadena de estilo y de estilo de hash donde cláusulas:

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

Gracias, estaba haciendo encadenamiento antes y funcionó, pero estaba tratando de hacerlo todo en un solo hash. Apreciar tu ayuda, me limitaré a encadenar por ahora. – nulltek

+1

Con Rails 4 también puede usar 'where.not (unit_id: nil)'. – irbanana

0

usted puede hacer esto:

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

Tenga en cuenta que los valores "open" y nil se colocan en una matriz y que utilizan ? para insertarlos. Esto ayuda a prevenir errores de inyección de SQL debido a las citas/escapes, etc. y es muy recomendable. See here for more.