Активний запис - знайдіть записи, які були створені до сьогодні


87

Я хочу отримати всі записи, де поле created_at менше, ніж сьогодні (дата). Чи є щось подібне:

MyTable.find_by_created_at(< 2.days.ago)

Відповіді:


168

Використання 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)

Використовуючи писк :

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

Дякую!. Якщо мені потрібні всі записи з MyTable1, які відносяться один до одного з MyTable за однакових умов, як написати запит? Я мав на увазі щось на зразок MyTable1.where(MyTable[:created_at] < Time.now), чи можливо це?
Sayuj

Так, я встановив відношення активного класу записів.
Саюдж

11

Щоб отримати всі записи, 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"]]
Павло Чучува,

2

Інший спосіб полягає у створенні області застосування MyModelабо у ApplicationRecordвикористанні інтерфейсу Arel, наприклад, 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що означає, що вам просто потрібно вибрати інше ім'я.
M-Dahab

-36

Time.now стосується прямо зараз чи цієї секунди. Отже, щоб знайти всіх користувачів раніше, просто використовуйте

@users = User.all

Це дозволить знайти всіх користувачів раніше, а також виключить майбутніх користувачів або користувачів, які приєднаються після Time.now


1
Time.now не те саме, що сьогодні
John Naegle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.