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:
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 }
Para obtener todos los registros de MyTable
creado 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 MyTable
con un event_date
mínimo de 2 días a partir de ahora:
MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Otra forma es crear un alcance en MyModel
o ApplicationRecord
usando 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 where
cadena. 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
ActiveRecord::Relation
define un método de instancia con el nombre, lo arel
que significa que solo necesita elegir un nombre diferente.
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
MyTable1.where(MyTable[:created_at] < Time.now)
es posible?