Howto: модель области для сегодняшних записей - PullRequest
10 голосов
/ 10 мая 2011

Эй, как установить область в рельсах 3 для сегодняшних записей?

Это работает, пока. Я не получаю данных.

class MyModel < ActiveRecord::Base
    scope :today, :conditions => { :created_at => Date.today }
end

Ответы [ 5 ]

22 голосов
/ 10 мая 2011

Поскольку в столбце "create_at" содержатся дата и время, но вам нужно сравнивать только дату, у вас есть два способа (я предполагаю, что вы используете MySQL):

  1. используйте МЕЖДУ
    scope :today, lambda { WHERE("created_at BETWEEN '#{DateTime.now.beginning_of_day}' AND '#{DateTime.now.end_of_day}'") }
  2. использование ДАТА () функция:
    scope :today, lambda { WHERE('DATE(created_at) = ?', Date.today)}

также, вы можете добавить столбец «create_on» втаблица только с датой.

Обновлено:

def self.up
   add_column table_name, :created_on, :date  
   add_column table_name, :updated_on, :date
end

scope :today, lambda { where(created_on: Date.today) }

16 голосов
/ 10 мая 2011

Я думаю, вы можете определить общую область следующим образом:

class MyModel < ActiveRecord::Base
  scope :created_on, lambda {|date| {:conditions => ['created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day]}}

  def self.today
    self.created_on(Date.today)
  end
end

Так что вы можете использовать

>> MyModel.today #-> records created today
>> MyModel.created_on(Date.today - 1.week) #-> records created a week ago
8 голосов
/ 10 мая 2011

Rails оценивает область на уровне класса, поэтому при использовании: condition => {: creation_at => Date.today} он оценивает Date.today и сравнивает все записи с предварительно оцененной датой.Чтобы избежать этого, используйте лямду для определения даты или времени для конкретных областей действия

 scope :today, lambda { :conditions =>[ "created_at = ? ", Date.today] }
2 голосов
/ 10 марта 2016

Я знаю, что это старый вопрос, но все же может помочь любому.

Это был мой способ решить эту проблему:

scope :today, -> { where(created_at: DateTime.now.beginning_of_day..DateTime.now.end_of_day) }

2 голосов
/ 25 мая 2012

ИМО, это самый понятный способ сделать это.

  def self.created_today
    where("created_at >= ? AND created_at < ?", Date.today, Date.tomorrow)
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...