ruby on rails - present - Rieles donde condición con valor nulo
ruby empty method (4)
La sintaxis correcta de SQL es my_id IS NULL
, así que si cambias tu primer fragmento al siguiente funcionará:
MyTable.where("my_id IS ?", nil).first
Ambas sintaxis están perfectamente bien. Depende de tu propia preferencia. Sin embargo, si se trata de un parámetro y usted no sabe si será nil
o no, será mejor que use:
MyTable.where(:my_id => parameter).first
Descubrí que usar where con symbol: my_id => nil y usar old school one con? es diferente. ¿Alguien podría explicarme por qué?
MyTable.where("my_id = ? ", nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (my_id = NULL ) LIMIT 1
No obtiene ningún dato
MyTable.where(:my_id => nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (`my_tables`.`my_id` IS NULL) LIMIT 1
Obtener datos que tienen my_id es nulo.
¿Cuál es la mejor práctica para usar en rieles?
Creo que no dejé claro mi pregunta. En mi aplicación de rieles, el parámetro de solicitud es nulo. La codificación existente es MyTable.where (: my_id => params [: id]). First En la tabla, hay muchos registros que tienen mi_id es nulo. Por lo tanto, el primer registro de la tabla es recoger sin darse cuenta. En primer lugar, sí, es el problema con los datos sucios en la tabla.
Para resolver este problema. Encuentro dos soluciones
Solución 1
if params[:id].present?
MyTable.where(:my_id => params[:id]).first
end
Solución 2
MyTable.where("my_id = ? ", nil).first
Como saben, si ponemos (si la condición es más y más), nuestra aplicación será más lenta y no será la programación funcional. Cuando intento la solución 2, me sorprende porque espero que dé el mismo resultado.
Para DB para NULL la sintaxis debe ser
my_id IS NULL
Entonces puedes darlo como:
MyTable.where("my_id is NULL ").first
Supongo que se llama "magia de rieles", puedes pasar rangos
Client.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)
se convierte
SELECT * FROM clients WHERE (clients.created_at BETWEEN ''2008-12-21 00:00:00''
AND ''2008-12-22 00:00:00'')
o si pasas un subconjunto
Client.where(:orders_count => [1,3,5])
los carriles lo harán
SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5))
En rails 4 puede especificar el valor como null usando la nueva sintaxis hash.
MyTable.where(my_id: nil).first