Ámbito de rieles donde no es igual

Estoy escribiendo un alcance que debería decir seleccionar todas las llamadas donde call_status = abierto y unit_id no es nulo. Soy realmente débil en Ruby y también nuevo en Rails y me está costando mucho expresar este derecho.

Aquí lo que tengo:

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

¿Debería usar un operador diferente para evaluar nil?

preguntado el 04 de julio de 12 a las 01:07

Sí. No conozco otra forma de hacer esto que where("call_status = ? AND NOT unit_id IS NULL", "open"). ¿Podría haber una mejor manera? -

No utilice visores como este. Use esto con lambdas, por si acaso. -

2 Respuestas

Que yo sepa, no hay forma de decirle a ActiveRecord que cree una cláusula NULL con un hash. Pero puede encadenar cláusulas de estilo cadena y estilo hash where:

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

Respondido 07 Oct 13, 18:10

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

Con Rails 4 también puedes usar where.not(unit_id: nil). - irbanana

Puedes hacerlo:

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 usamos ? para insertarlos. Esto ayuda a prevenir errores de inyección de SQL debido a citas / escapes, etc. y se recomienda encarecidamente. Mira aquí para más.

Respondido 04 Jul 12, 01:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.