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

时间:2011-12-14 21:30:12

标签: ruby-on-rails ruby ruby-on-rails-3

  

可能重复:
  Scoping date attribute for this week?

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

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

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


ANSWER

出于某种原因,我必须添加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

更新的答案

由于我所处的时区,我不得不做advance(:days => -1)。我通过确保我在自己的时区来摆脱这个。所以现在它应该是正常的:

def self.last_week
  where(:purchase_date => 1.week.ago.beginning_of_week..1.week.ago.end_of_week)
end

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

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

config.time_zone = "Eastern Time (US & Canada)"
祝你好运。

1 个答案:

答案 0 :(得分:11)

这应该可以解决问题:

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 }) }