Как найти запись, созданную за предыдущий месяц? - PullRequest
6 голосов
/ 02 февраля 2009

У меня есть таблица, где новые записи добавляются ежедневно. Как мне найти записи, созданные в предыдущем месяце?

Ответы [ 11 ]

11 голосов
/ 02 февраля 2009

Настройка именованной области:

named_scope :in_last_month, :conditions => [ "records.created_at > ?", 1.month.ago ]

Для вызова (в вашем контроллере):

Record.in_last_month
10 голосов
/ 03 февраля 2009

Я думаю, named_scope - довольно элегантный путь, но если вы выберете этот путь, вы захотите использовать его с методом lambda, чтобы время не ограничивалось временем, когда приложение изначально загружен.

Например, это:

named_scope :last_month, :conditions => 
  ['created_at > ? AND created_at < ?', 
  Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]

будет работать правильно в первый месяц работы вашего приложения, но неправильно в следующем месяце, если приложение не будет перезапущено.

Но это:

named_scope :last_month, lambda {
  {:conditions => ['created_at > ? AND created_at < ?', 
   Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]}}

будет работать каждый раз, потому что лямбда-метод выполняется при каждом вызове, переоценивая Date.today s.

3 голосов
/ 02 февраля 2009

Предполагая, что ваши записи помечены временем, вы можете просто сделать что-то вроде этого:

Thing.find(:all, :conditions => ["created_at > ?", Time.now - 1.month])

Если они не помечены временем, вы должны начать хранить информацию, так как это то, что вы захотите посмотреть позже.

2 голосов
/ 27 апреля 2015

Принятый ответ и лямбда-улучшение не работают в Rails 4.

Обновление для Rails 4:

scope :last_month, -> {
    where( 'created_at > ? AND created_at < ?', 
            Date.today.last_month.beginning_of_month, 
            Date.today.beginning_of_month )}
1 голос
/ 06 ноября 2012

В одном из моих проектов я использовал так:

Thing.where('created_at BETWEEN ? AND ? ', DateTime.now.beginning_of_month - 1.month, DateTime.now.beginning_of_month)

в Rails 3 с использованием last_month выдает ошибку: Date.today.last_month.beginning_of_month

NoMethodError: неопределенный метод `last_month '

1 голос
/ 03 февраля 2009

Спасибо всем, я закончил с этим:

find(:all, :conditions => ['created_at > ? AND created_at < ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month])
0 голосов
/ 12 сентября 2018

Попробуйте это для Rails 4+, обратите внимание, что Date.current будет использовать часовой пояс вашего приложения (указанный в application.rb):

scope :created_last_month, lambda {
  where(created_at: Date.current.last_month.beginning_of_month..Date.current.last_month.end_of_month)
}
0 голосов
/ 07 февраля 2009

это хороший кандидат для синтаксиса SQL МЕЖДУ

named_scope :last_month, :conditions => ['created_at BETWEEN ? AND ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month])
0 голосов
/ 03 февраля 2009

У меня недостаточно репутации, чтобы голосовать, но, пожалуйста, примите к сведению комментарий, в котором упоминается использование лямбд в named_scopes. На эту тему должен быть полезен эпизод с Railscasts:

http://railscasts.com/episodes/108

0 голосов
/ 02 февраля 2009
Thing.find(:all, :conditions => ["created_at > ?", 1.month.ago.at_beginning_of_month])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...