Як отримати запис, створений сьогодні рейками activerecord?


Відповіді:


220
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PS: Ця відповідь була змінена, оскільки відповідь Харіша Шетті була кращою за мою. Як моя відповідь прийнята одна. Цю відповідь я оновив для підтримки громади


4
Можна зробити Post.where (created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Рафаель Олівейра,

1
Немає сенсу перевіряти, чи створено щось до кінця сьогодні (оскільки завтра ще не сталося).
jakeonrails

4
Хоча Post.where("created_at >= ?", Time.zone.now.beginning_of_day)це дуже розумно, я б схвалював Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day). Є сенс робити так, щоб ви могли маніпулювати часом. Наприклад, якщо ви тестуєте, ви, мабуть, маніпулюєте часом, і тоді перший варіант не працюватиме. Ви хочете уникнути такого можливого майбутнього провалу, який, ймовірно, займе певний час налагодження.
lucasarruda

121

Я знаю, що на це питання є прийнята відповідь. Рішення, запропоноване у прийнятій відповіді, може спричинити проблеми з продуктивністю, коли розмір таблиці збільшується.

Як правило, якщо ви здійснюєте пошук на основі created_atстовпця, додайте індекс у таблицю у файлі міграції.

add_index :posts, :created_at

Тепер для пошуку записів, створених сьогодні:

Рейки 3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)

Для пошуку публікацій, створених у певний день.

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))

--------- АБО -------------

Додайте статичний метод до своєї моделі

class Post < ActiveRecord::Base
  def self.today
    where("created_at >= ?", Time.zone.now.beginning_of_day)
  end
end

Post.today #returns posts today

Рейки 2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])

--------- АБО -------------

Додайте в свою модель name_scope

class Post < ActiveRecord::Base    
  named_scope :today, lambda { 
    {
      :conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
    }
  }
end

Post.today #returns posts today

1
Відмінний момент щодо індексації. Просто хотів уточнити, що scopeприклад у цій публікації є лише для Rails 3, оскільки, схоже, це під заголовком Rails 2. У Rails 2 вам потрібно використовувати, named_scopeа не використовувати scope. Крім того, в Rails 3 ви могли б еквівалентно використовувати метод класу, def self.today where("created_at >= ?", Time.now.beginning_of_day) end який, ймовірно, чистіший, ніж використання області застосування в цьому випадку, оскільки він дозволяє відмовитися від лямбда.
evanrmurphy

@ evanrmurphy, Дякую, що зауважив це. Я маю фіксовану відповідь.
Harish Shetty

@evanrmurphy може / слід переглянути свій коментар з "Тільки для рейки 3" до "Рейки 3 і більше"?
kaichanvong

@kaichanvong Я не знайомий з Rails 4, тому я хотів би сказати "Рейки 3 (і більше?)", але ТАК не дозволять мені редагувати коментар: - /
evanrmurphy

30

MySQL:

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL:

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3

19

Відповідь Мохіта Джайна адаптувалася до Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now

16

У Rails 5.1 є all_dayпомічник, який тут корисний.

Post.where(created_at: Date.today.all_day)

або

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)


5

модель.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

posts_controller.rb

Post.posted_today

2
@Pathiv, between_periodвиглядає цікаво. Я не знайшов жодної документації на це. Чи можете ви надати якесь посилання? Яким чином рейки вибирають стовпчик для порівняння?
Харіш Шетті

1

Чомусь жодне з інших рішень у цій посаді, ані інші в StackOverflow не працювали для мене (використовуючи Rails 4.2.4 та Ruby 2.2.3p173). Це єдиний запит, з яким я міг би працювати з моєю базою даних Postgres:

Post.where("created_at >= TIMESTAMP 'now'")

-1

Запитувати записи, створені з сьогоднішнього дня

Використовуйте область застосування з arel

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
  }
end

Тоді ми можемо ним скористатися

today_posts = Post.created_from_today

where('created_at >= now()')знайшов би лише предмети, де в майбутньому був створений_at.
ПР Уайтхед

Так, я би
Hieu Pham

Зараз у вас проблема полягає в тому, що записи, позначені майбутніми датами, будуть представлені так само, як і сьогоднішні. Якщо ви намагаєтеся уникати використання між ними, вам слід також вказати .lteq(Time.zone.now.end_of_day)).
ПР Уайтхед

-4

У рейках 4.2.3 для отримання записів, створених сьогодні, використовуючи mysql, використовуйте наступне.

@usergoals = Goal.where ("userid =: userid та дата (created_at) =: дата", {userid: params [: id], дата: Date.today})

тут я використовую кілька умов, якщо ви хочете, ви можете редагувати його для однієї умови.

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