2009-12-29 27 views
1

我有一個模型,它擁有2個屬性:valid_from和valid_to。在查找條件中多次使用相同的參數:hash

我需要選擇當前有效的所有實例,即valid_from < = today和valid_to> = today。

我有以下發現:

Mymodel.find(:all, :conditions => ["valid_from <= ? and valid_to >= ?", Date.today, Date.today]) 

我已經想到了一個變量存儲Date.today並調用該變量,但我仍然需要兩次調用它。

my_date = Date.today 
Mymodel.find(:all, :conditions => ["valid_from <= ? and valid_to >= ?", my_date, my_date]) 

有沒有辦法改善和只做一個調用變量來匹配所有的「?」在:條件?

感謝, P.

+0

啊,但第二個片斷更加優化爲u不需要做兩次計算... – khelll

+0

好的,謝謝,但有沒有辦法只鍵入一次「my_date」,以便它符合條件中的兩個問號? – Pierre

回答

1

我會用named_scope。在模型中添加:

named_scope :valid, 
      :conditions => 
      ["valid_from <= ? and valid_to >= ?", Date.today, Date.today] 

然後在你的控制器,你可以撥打:

@mymodels = Mymodel.valid 

我認爲,專注於減少兩次調用Date.today只有一個電話是在浪費時間。它不會讓您的應用程序更快或使用更少的內存。

+0

我接受最後一點的答案:可能有辦法,但沒有任何意義/特別的好處。 謝謝 – Pierre

+1

這是在named_scope中使用Date.today的問題。這是因爲名稱範圍是在首次編譯activerecord模型時編譯的。因此,對Date.today的調用將被評估,因爲這是第一次找到它時的方法調用。在後續調用中,該值將被修復。因此,以日期的價值作爲輸入是個好主意。 在http://jitu-blog.blogspot.com/2009/07/looking-into-rails-namedscope.html上閱讀有關此已知問題的更多信息 – Sohan

1

我不知道有什麼方法可以解決你所問的問題,但即使你可以,我也不認爲它會給你帶來太多的收益。我會在模型類中創建一個named scope

在這個例子中,你可以通過日期到指定的範圍內,否則將默認爲今天的日期,如果沒有指定日期:

named_scope :by_valid_date, lambda { |*args| 
      { :conditions => ["valid_from <= ? and valid_to >= ?", 
       (args.first || Date.today), (args.first || Date.today)]} } 
相關問題