上周如何通过Date对象进行范围调整

Lea*_*RoR 13 ruby ruby-on-rails ruby-on-rails-3

可能重复:
本周的作用域日期属性?

我本周试图确定我的所有产品的范围,所以它应该显示所有产品,直到一周中的哪一天.

class Product < ActiveRecord::Base
   attr_accessible :purchase_date

   def self.last_week # All prices of last week.
      where(:purchase_date => 1.week.ago)
   end

   create_table :products do |t|
      t.date :purchase_date
   end
end
Run Code Online (Sandbox Code Playgroud)

此代码在视图中不呈现任何内容,因此我需要更正哪些内容?


回答

出于某种原因,我必须添加advance(:days => -1)以便也检索星期一.你可能不必这样做.

def self.last_week
    where(:purchase_date => 1.week.ago.beginning_of_week.advance(:days => -1)..1.week.ago.end_of_week).order("purchase_date desc")
end
Run Code Online (Sandbox Code Playgroud)

更新的答案

我必须这样做,advance(:days => -1)因为我所在的时区.我通过确保我在自己的时区来摆脱这个.所以现在它应该是正常的,因为它应该是:

def self.last_week
  where(:purchase_date => 1.week.ago.beginning_of_week..1.week.ago.end_of_week)
end
Run Code Online (Sandbox Code Playgroud)

只有当您使用默认的Rails时区或您自己配置时,它才能正常工作:

应用程序/配置/环境/ development.rb

config.time_zone = "Eastern Time (US & Canada)"
Run Code Online (Sandbox Code Playgroud)

祝好运.

apn*_*ing 12

这应该做的伎俩:

scope :last_week, lambda { where("purchase_date >= :date", :date => 1.week.ago) } 

scope :past_week, lambda { where("purchase_date >= :start_date AND purchase_date <= :end_date", {:start_date => 1.week.ago, :end_date => 1.day.ago }) } 
Run Code Online (Sandbox Code Playgroud)

  • 是的,每次都要正确更新日期 (2认同)