Я хочу получить все записи, в которых поле created_at меньше, чем сегодня (дата). Есть что-нибудь вроде:
MyTable.find_by_created_at(< 2.days.ago)
Ответы:
Используя ActiveRecord стандартным способом:
MyModel.where("created_at < ?", 2.days.ago)
Используя базовый интерфейс Arel :
MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))
Используя тонкий слой поверх Arel:
MyModel.where(MyModel[:created_at] < 2.days.ago)
Использование squeel :
MyModel.where { created_at < 2.days.ago }
Чтобы получить все записи, MyTable
созданные до 2 дней назад:
MyTable.where(created_at: Date.new..2.days.ago)
Обратите внимание, что вы также можете искать записи с полями, содержащими поля, в будущем аналогичным образом, то есть получить все записи MyTable
, event_date
по крайней мере, через 2 дня:
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"]]
Другой способ - создать область видимости в интерфейсе ArelMyModel
или при его ApplicationRecord
использовании, например tokland, описанный в его ответе следующим образом:
scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Пример использования области:
MyModel.arel(:created_at, :lt, 2.days.ago)
Для всех предположений проверьте документацию или исходный код . Этот прицел не разрывает where
цепочку. Это означает, что вы также можете:
MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
ActiveRecord::Relation
определяет метод экземпляра с именем, arel
что означает, что вам просто нужно выбрать другое имя.
Time.now относится к прямо сейчас или к этой самой секунде. Итак, чтобы прямо сейчас найти всех пользователей, просто используйте
@users = User.all
Это найдет всех пользователей до этого прямо сейчас и исключит будущих пользователей или пользователей, которые присоединятся после Time.now
MyTable1.where(MyTable[:created_at] < Time.now)
возможно ли это?