Registro activo: busque registros que se crearon antes de hoy


87

Quiero obtener todos los registros donde el campo created_at es menor que hoy (una fecha). ¿Hay algo como:

MyTable.find_by_created_at(< 2.days.ago)

Respuestas:


167

Usando ActiveRecord de la forma estándar:

MyModel.where("created_at < ?", 2.days.ago)

Usando la interfaz subyacente de Arel :

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

Usando una capa fina sobre Arel:

MyModel.where(MyModel[:created_at] < 2.days.ago)

Usando squeel :

MyModel.where { created_at < 2.days.ago }

¡Gracias!. Si necesito todos los registros de MyTable1, que tienen una relación uno a uno con MyTable en la misma condición, ¿cómo escribir la consulta? Me refería a algo como ¿ MyTable1.where(MyTable[:created_at] < Time.now)es posible?
Sayuj

Sí, he configurado la clase de registro activo de relación.
Sayuj

11

Para obtener todos los registros de MyTablecreado hasta hace 2 días:

MyTable.where(created_at: Date.new..2.days.ago)

Tenga en cuenta que también se puede buscar registros con campos que contienen los campos en el futuro en forma similar, es decir, para obtener todos los registros de MyTablecon un event_datemínimo de 2 días a partir de ahora:

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)

Esto produce"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva

2

Otra forma es crear un alcance en MyModelo ApplicationRecordusando la interfaz de Arel como tokland sugirió en su respuesta así:

scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

Ejemplo de uso del alcance:

MyModel.arel(:created_at, :lt, 2.days.ago)

Para todas las predicaciones, consulte la documentación o el código fuente . Este alcance no rompe la wherecadena. Esto significa que también puede hacer:

MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2

Idea fantástica. Pero ActiveRecord::Relationdefine un método de instancia con el nombre, lo arelque significa que solo necesita elegir un nombre diferente.
M-Dahab

-36

Time.now se refiere al ahora mismo o en este mismo segundo. Entonces, para encontrar a todos los usuarios antes ahora, solo use

@users = User.all

Esto encontrará a todos los usuarios anteriores ahora mismo y excluirá a los futuros usuarios o usuarios que se unan después de Time.now


1
Time.now no es lo mismo que Today
John Naegle
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.