Active Record - Найдите записи, которые были созданы_at до сегодняшнего дня

87

Я хочу получить все записи, в которых поле created_at меньше, чем сегодня (дата). Есть что-нибудь вроде:

MyTable.find_by_created_at(< 2.days.ago)
Саюдж
источник

Ответы:

167

Используя 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 }
Tokland
источник
Благодарность!. Если мне нужны все записи из MyTable1, которые связаны один к одному с MyTable при одном и том же условии, как написать запрос? Я имел в виду что-то вроде, MyTable1.where(MyTable[:created_at] < Time.now)возможно ли это?
Sayuj 02
Да, я установил отношение активного класса записи.
Sayuj 02
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

Другой способ - создать область видимости в интерфейсе 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
3limin4t0r
источник
Фантастическая идея. Но ActiveRecord::Relationопределяет метод экземпляра с именем, arelчто означает, что вам просто нужно выбрать другое имя.
М-Дахаб,
-36

Time.now относится к прямо сейчас или к этой самой секунде. Итак, чтобы прямо сейчас найти всех пользователей, просто используйте

@users = User.all

Это найдет всех пользователей до этого прямо сейчас и исключит будущих пользователей или пользователей, которые присоединятся после Time.now

Гомер Джон
источник
1
Time.now - это не то же самое, что сегодня
Джон Нэгл