tutorial software rails generate and ruby-on-rails syntax where

ruby-on-rails - software - ruby on rails tutorial pdf



Rieles: usar mayor que/menor que con una instrucción where (7)

A menudo tengo este problema con los campos de fecha (donde los operadores de comparación son muy comunes).

Para profundizar en la respuesta de Mihai, que creo que es un enfoque sólido.

A los modelos puedes agregar ámbitos como este:

scope :updated_at_less_than, -> (date_param) { where(arel_table[:updated_at].lt(date_param)) }

... y luego en su controlador, o donde sea que esté usando su modelo:

result = MyModel.updated_at_less_than(''01/01/2017'')

... un ejemplo más complejo con combinaciones se ve así:

result = MyParentModel.joins(:my_model). merge(MyModel.updated_at_less_than(''01/01/2017''))

Una gran ventaja de este enfoque es (a) le permite redactar sus consultas desde diferentes ámbitos y (b) evita colisiones de alias cuando se une a la misma tabla dos veces, ya que arel_table manejará esa parte de la generación de consultas.

Intento encontrar todos los usuarios con una identificación mayor a 200, pero estoy teniendo problemas con la sintaxis específica.

User.where(:id > 200)

y

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

ambos han fallado

¿Alguna sugerencia?


Arel es tu amigo

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


Corta:

User.where("id > 200")


Prueba esto

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


Si desea una escritura más intuitiva, existe una gema llamada squeel que le permitirá escribir sus instrucciones de esta manera:

User.where{id > 200}

Observe que los caracteres ''corchete'' {} y el id son solo un texto.

Todo lo que tienes que hacer es agregar squeel a tu Gemfile:

gem "squeel"

Esto podría facilitarle mucho la vida al escribir una declaración SQL compleja en Ruby.


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

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

generará el SQL

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

Lo mismo se puede hacer por menos que con -Float::INFINITY .

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


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