Как получить запись, созданную сегодня rails activerecord?



Как я должен написать условный оператор, когда я хочу получить все записи, которые были созданы сегодня?

702   9  

9 ответов:

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

PS: этот ответ был изменен, поскольку ответ Хариша Шетти был лучше моего. В качестве моего ответа принимается один. Я обновил этот ответ для поддержки сообщества

Я знаю, что этот вопрос принято отвечать. Решение, предложенное в принятом ответе, может вызвать проблемы с производительностью при увеличении размера таблицы.

как правило, если вы выполняете поиск на основе 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])

--------- или -------------

добавьте named_scope в вашу модель

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

Post.today #returns posts today

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

ответ Мохита Джайна адаптирован для Rails3

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

модель.РБ

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

posts_controller.РБ

Post.posted_today

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

этот "областей видимости имен" атрибут с table_name.

по какой-то причине ни одно из других решений в этом посте, ни другие на StackOverflow не работали для меня (используя Rails 4.2.4 и Ruby 2.2.3p173). Это единственный запрос, который я мог бы получить для работы с моей базой данных Postgres:

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

для запроса записей, которые созданы с сегодняшнего дня

используйте область с arel

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

использовать область с необработанным запросом

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where('created_at >= now()')
  }
end

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

today_posts = Post.created_from_today

в rails 4.2.3 для получения записей, созданных сегодня, с помощью mysql используйте следующее.

@usergoals = цель.где("имяпользователя = :userId и дата(created_at) = :дата", { ID пользователя: параметр params[:ИД], дата: дата.сегодня })

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

Comments

    Ничего не найдено.