我有一个名为 Article 的模型,我想做的是显示 created_at 日期为上周的所有文章。我了解如何滚动一周(即到现在的最后 7 天),例如这个问题。
scope :last_week, lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }
但是,我想做的是找到上周周日到周六的文章,不管今天是哪一天。
我有一个名为 Article 的模型,我想做的是显示 created_at 日期为上周的所有文章。我了解如何滚动一周(即到现在的最后 7 天),例如这个问题。
scope :last_week, lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }
但是,我想做的是找到上周周日到周六的文章,不管今天是哪一天。
Rails 提供了一个辅助方法来获取给定日期的一周的开始和结束。该方法默认为星期一,因此您必须传入星期天才能覆盖它。
scope :last_week, lambda { :conditions => { :created_at => Date.today.at_beginning_of_week(:sunday)..Date.today.at_end_of_week(:sunday) } }
我以 Date.today 为例,但您可以让范围具有日期参数,以便您可以将任何日期应用于范围。
编辑:
scope :last_week, lambda{ |date| {:conditions => ((date - 1.week).at_beginning_of_week(:sunday))..((date-1.week).at_end_of_week(:sunday)) }}
然后只需将范围称为
last_week(some_date)
Date.parse
给出了在工作日名称上运行的令人敬畏的结果:
require 'date'
# ⇒ true
Date.today
# ⇒ <Date: 2013-04-02 ((2456385j,0s,0n),+0s,2299161j)>
Date.parse('Sunday')
# ⇒ <Date: 2013-03-31 ((2456383j,0s,0n),+0s,2299161j)>
Date.parse('Wednesday')
# ⇒ <Date: 2013-04-03 ((2456386j,0s,0n),+0s,2299161j)>
所以你只需要:
def last_weekend
d = Date.parse('Saturday')
d -= 7 if d > Date.today
Range.new d, d+1
end
希望这可以帮助。
类似于约翰的回答,但我认为这更适合你的情况:
scope :last_week, lambda { { conditions: { created_at: last_week_range } } }
def self.last_week_range
1.week.ago.beginning_of_week(:sunday)..1.week.ago.end_of_week(:sunday)
end