我有一個名爲Article的模型,我想要做的就是顯示上個星期created_at日期的所有文章。我瞭解如何進行滾動周(即最近7天到現在),如this question。在Rails中計算非滾動上週
scope :last_week, lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }
但是,我想要做的是找到上週的星期日 - 星期六的文章,無論今天是哪一天。
我有一個名爲Article的模型,我想要做的就是顯示上個星期created_at日期的所有文章。我瞭解如何進行滾動周(即最近7天到現在),如this question。在Rails中計算非滾動上週
scope :last_week, lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }
但是,我想要做的是找到上週的星期日 - 星期六的文章,無論今天是哪一天。
約翰的答案相似,但我認爲這符合你的情況好一點:
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
Rails提供了一個幫助方法來獲取給定日期的一週的開始和結束。該方法默認爲星期一,因此您必須通過星期日才能覆蓋它。
scope :last_week, lambda { :conditions => { :created_at => Date.today.at_beginning_of_week(:sunday)..Date.today.at_end_of_week(:sunday) } }
我USEN 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)
當我這樣做,我得到3/31的開始日期。我將如何適應始終指的是前一週(即3/24)? – yellowreign
更新了我的答案。 – John
謝謝。當我編輯範圍並調用Article.last_week(Date.today)時,出現語法錯誤。意外的tASSOC,期待'}'(它指向「:conditions =>」之後) – yellowreign
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
希望這會有所幫助。
這似乎工作,如果日期是未來,例如,如果我這樣做Date.parse('星期三)。但是,我期待的是上週2013-03-24到2012-03-30,而不是2013-03-31到2013-04-06。 – yellowreign
'd = Date.parse('Saturday')'⇒'#
當我添加這個並使用Article.last_week時,我得到一個語法錯誤。 「意外」:',期待')' – yellowreign
您使用的是哪個版本的ruby?我在這裏使用了1.9哈希語法。 – Luke
啊,我的錯字現在修正了 – Luke