在Rails中计算上周的非滚动

时间:2013-04-02 03:20:32

标签: ruby-on-rails ruby

我有一个名为Article的模型,我想要做的是显示上周创建的日期为所有文章。我理解如何滚动周(即过去7天到现在),例如this question

scope :last_week,  lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }

然而,我想做的是找到星期日 - 上周六的文章,无论当天是哪一天。

3 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

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

希望这有帮助。

答案 2 :(得分:0)

与约翰的答案相似,但我认为这更适合你的情况:

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