Saltar al contenido

Rieles: uso de mayor que/menor que con una instrucción where

Hola, descubrimos la solución a tu interrogante, desplázate y la hallarás un poco más abajo.

Solución:

Prueba esto

User.where("id > ?", 200) 

Solo probé esto en Rails 4, pero hay una forma interesante de usar un rango con un where hash para obtener este comportamiento.

User.where(id: 201..Float::INFINITY)

generará el SQL

SELECT `users`.* FROM `users`  WHERE (`users`.`id` >= 201)

Se puede hacer lo mismo por menos que con -Float::INFINITY.

Acabo de publicar una pregunta similar sobre cómo hacer esto con fechas aquí en SO.

>= contra >

Para evitar que las personas tengan que buscar y seguir la conversación de los comentarios, aquí están los aspectos más destacados.

El método anterior solo genera un >= consulta y no a >. Hay muchas maneras de manejar esta alternativa.

Para números discretos

Puedes usar un number_you_want + 1 estrategia como la anterior donde estoy interesado en Usuarios con id > 200 pero en realidad busca id >= 201. Esto está bien para números enteros y números en los que puede incrementar en una sola unidad de interés.

Si tiene el número extraído en una constante bien nombrada, esta puede ser la más fácil de leer y comprender de un vistazo.

lógica invertida

Podemos usar el hecho de que x > y == !(x <= y) y usa la cadena where not.

User.where.not(id: -Float::INFINITY..200)

que genera el SQL

SELECT `users`.* FROM `users` WHERE (NOT (`users`.`id` <= 200))

Esto toma un segundo adicional para leer y razonar, pero funcionará para valores o columnas no discretos donde no puede usar el + 1 estrategia.

mesa arela

Si quieres ponerte elegante puedes hacer uso de la Arel::Table.

User.where(User.arel_table[:id].gt(200))

generará el SQL

"SELECT `users`.* FROM `users` WHERE (`users`.`id` > 200)"

Los detalles son los siguientes:

User.arel_table              #=> an Arel::Table instance for the User model / users table
User.arel_table[:id]         #=> an Arel::Attributes::Attribute for the id column
User.arel_table[:id].gt(200) #=> an Arel::Nodes::GreaterThan which can be passed to `where`

Este enfoque le dará la exacto SQL que le interesa, sin embargo, no muchas personas usan la tabla Arel directamente y pueden encontrarla desordenada y/o confusa. Tú y tu equipo sabrán qué es lo mejor para ti.

Prima

A partir de Rails 5, ¡también puede hacer esto con fechas!

User.where(created_at: 3.days.ago..DateTime::Infinity.new)

generará el SQL

SELECT `users`.* FROM `users` WHERE (`users`.`created_at` >= '2018-07-07 17:00:51')

Doble Bono

Una vez que se lance Ruby 2.6 (25 de diciembre de 2018), podrá usar la nueva sintaxis de rango infinito. En vez de 201..Float::INFINITY podrás simplemente escribir 201... Más información en esta publicación de blog.

Un mejor uso es crear un ámbito en el modelo de usuario where(arel_table[:id].gt(id))

Te mostramos las comentarios y valoraciones de los lectores

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *