【问题标题】:How to get record created today by rails activerecord?如何获取rails activerecord今天创建的记录?
【发布时间】:2010-05-27 08:59:21
【问题描述】:

当我想要获取今天创建的所有记录时,我应该如何编写条件语句?

【问题讨论】:

    标签: ruby-on-rails date rails-activerecord


    【解决方案1】:
    Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
    

    PS:这个答案已被修改,因为 Harish Shetty 的答案比我的好。因为我的回答被接受了。我已更新此答案以获得社区支持

    【讨论】:

    • 在最新版本中,使用Post.where(created_at: Time.current.all_day) 可以更加精简
    【解决方案2】:

    Mohit Jain 的答案适用于 Rails3

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

    【讨论】:

      【解决方案3】:

      Rails 5.1 有一个 all_day 帮助器,在这里很有用。

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

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

      【讨论】:

        【解决方案4】:

        我知道这个问题有一个公认的答案。当表大小增加时,接受的答案中建议的解决方案可能会导致性能问题。

        通常,如果您基于 created_at 列执行查找,请在迁移文件中的表上添加索引。

        add_index :posts, :created_at
        

        现在,查找今天创建的记录:

        Rails 3/4

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

        查找在特定日期创建的帖子。

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

        --------- OR -------------

        为模型添加静态方法

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

        Rails 2

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

        --------- OR -------------

        为你的模型添加一个 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
        

        【讨论】:

        • 关于索引的要点。只是想澄清一下,本文中的 scope 示例仅适用于 Rails 3,因为它看起来像是在 Rails 2 标题下。在 Rails 2 中,您需要使用 named_scope 而不是 scope。此外,在 Rails 3 中,您可以等效地使用类方法 def self.today where("created_at &gt;= ?", Time.now.beginning_of_day) end,这可能比在这种情况下使用范围更干净,因为它允许您放弃 lambda。
        • @evanrmurphy,感谢您的注意。我有固定的答案。
        • @evanrmurphy 可以/应该将您的评论从“仅限 Rails 3”修改为“Rails 3 及更高版本”吗?
        • @kaichanvong 我对 Rails 4 不熟悉,所以我想说“Rails 3(以及更高版本?)”,但不允许我编辑评论:-/
        【解决方案5】:

        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
        

        【讨论】:

          【解决方案6】:

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

          这用table_name“命名范围”属性。

          【讨论】:

            【解决方案7】:

            由于某种原因,这篇文章中的其他解决方案和 StackOverflow 上的其他解决方案都对我不起作用(使用 Rails 4.2.4 和 Ruby 2.2.3p173)。这是我可以使用我的 Postgres 数据库的唯一查询:

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

            【讨论】:

              【解决方案8】:

              模型.rb

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

              posts_controller.rb

              Post.posted_today
              

              【讨论】:

              • @Pathiv, between_period 看起来很有趣。我没有找到任何文档。你能提供一些链接吗? rails 如何选择列进行比较?
              【解决方案9】:

              查询今天创建的记录

              将范围与 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 &gt;= now()') 只会找到 created_at 在未来的项目。
              • 是的,我会把它从答案中删除,很好,谢谢
              • 您现在遇到的问题是,标有未来日期的记录将与今天的记录一样显示。如果你想避免使用 between,你也应该指定 .lteq(Time.zone.now.end_of_day))
              【解决方案10】:

              在 rails 4.2.3 获取今天创建的记录,使用 mysql 使用以下。

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

              如果你愿意,我在这里使用多个条件,你可以为单个条件编辑它。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-01-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-11-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多