Як мені написати умовне твердження, коли я хочу отримати всі записи, які були створені сьогодні?
Як мені написати умовне твердження, коли я хочу отримати всі записи, які були створені сьогодні?
Відповіді:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Ця відповідь була змінена, оскільки відповідь Харіша Шетті була кращою за мою. Як моя відповідь прийнята одна. Цю відповідь я оновив для підтримки громади
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)
. Є сенс робити так, щоб ви могли маніпулювати часом. Наприклад, якщо ви тестуєте, ви, мабуть, маніпулюєте часом, і тоді перший варіант не працюватиме. Ви хочете уникнути такого можливого майбутнього провалу, який, ймовірно, займе певний час налагодження.
Я знаю, що на це питання є прийнята відповідь. Рішення, запропоноване у прийнятій відповіді, може спричинити проблеми з продуктивністю, коли розмір таблиці збільшується.
Як правило, якщо ви здійснюєте пошук на основі 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
scope
приклад у цій публікації є лише для Rails 3, оскільки, схоже, це під заголовком Rails 2. У Rails 2 вам потрібно використовувати, named_scope
а не використовувати scope
. Крім того, в Rails 3 ви могли б еквівалентно використовувати метод класу, def self.today where("created_at >= ?", Time.now.beginning_of_day) end
який, ймовірно, чистіший, ніж використання області застосування в цьому випадку, оскільки він дозволяє відмовитися від лямбда.
Відповідь Мохіта Джайна адаптувалася до Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
У Rails 5.1 є all_day
помічник, який тут корисний.
Post.where(created_at: Date.today.all_day)
або
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Це "назви імен" атрибут з table_name
.
модель.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
виглядає цікаво. Я не знайшов жодної документації на це. Чи можете ви надати якесь посилання? Яким чином рейки вибирають стовпчик для порівняння?
Запитувати записи, створені з сьогоднішнього дня
Використовуйте область застосування з 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.
.lteq(Time.zone.now.end_of_day))
.
У рейках 4.2.3 для отримання записів, створених сьогодні, використовуючи mysql, використовуйте наступне.
@usergoals = Goal.where ("userid =: userid та дата (created_at) =: дата", {userid: params [: id], дата: Date.today})
тут я використовую кілька умов, якщо ви хочете, ви можете редагувати його для однієї умови.