2011-10-02 112 views
2

快速的問題。如果我有一個模型,比如慈善機構,它具有start_dateend_date屬性,我如何將其設置爲控制器中的方法的current_charity基於時間的Rails實例變量?

我知道我必須做某種Charities.find(params[:something]),並且將只需要設置current_charity等於一個是start_date爲> =當前的日期,以及是誰的end_date是< =當前日期(只有一次一個「當前」)。我通常只是通過params [:id]找到一個模型,所以這對我來說是新的。

謝謝!

回答

5

在模型中添加範圍方法:

def self.current 
    now = Time.now 
    where("start_date <= ? AND ? <= end_date", now, now).first 
end 

然後在你的控制器:

current_charity = Charity.current 
+4

我喜歡Thilo的回答比我的好。但一定要寫很多單元測試!基於時間的邏輯非常棘手,很容易錯過邊緣情況。你可以用一個「模擬時鐘」測試時間 - 在RSpec中,你可以做一些類似'Time.stub!(:now).and_return {Time.parse(「2010-01-01 12:00」)}'來欺騙你的代碼認爲這是不同的一天。 – AlexChaffee

1

快速回答:搜索end_date爲零的慈善機構。

較長的答案:您的數據模型可能與您所需的語義不匹配。在我看來,start_date在這裏是不相關的 - 是不是目前的慈善機構end_date尚未發生?

一般來說,獲取最新X的一種方法是獲取所有X,按降序排序,並取第一個X(或以SQL語言,使用LIMIT 1)。在ActiveRecord的,它是這樣的:

Charity.order("end_date DESC").first 

雖然我在我的Rails有點生疏3 AR語法,我不認爲查詢將解決您最實際的問題(儘管它看起來很酷,amirite?)。

另一個解決方案是反規範化 - 增加一個current布爾字段,和一個before_save濾波器,基於您所描述的邏輯將self[:current]。編輯:其實,這不會在這裏工作,因爲時間流逝,什麼是當前將改變個人模型的數據範圍之外。

我最好的建議是寫很多單元測試!基於時間的邏輯非常棘手,很容易錯過邊緣情況。

0

記住要在數據庫中添加索引爲你會經常使用的搜索欄。

通過添加數據庫遷移來添加索引。