Czas w named_scope

Witam.

Mam taki named_scope

named_scope :active, :conditions => ["expire > ?", Time.zone.now]

I za każdym wywołaniem, po spojrzeniu do loga za Time.zone.now jest wstawiany ten sam czas - 2009-08-17 11:53:54.033000, a powinien być aktualny, zawsze inny.

SELECT count(*) AS count_all FROM “requests” WHERE ((((expire > ‘2009-08-17 11:53:54.033000’) AND (“requests”.development_id = 77))

Czy te named_scopy są sechowane? Jak rozwiązać problem?

Pozdrawiam

Tak, named_scopes są cacheowane. Rozwiązaniem może być przekazanie Time.now jako parametru:

[code=ruby]named_scope :active, lambda do |now|
{ :conditions => [‘expire > ?’, now] }
end

Model.active(Time.now).all[/code]

Działa, dzięki wielkie.

Nie ma potrzeby podawania Time.now jako parametr

  named_scope :active, lambda { { :conditions => ['expire > ?', Time.now] } }

W sumie nie ma, rozpędziłem się z tym parametrem :slight_smile:

A ja przyczepię się do słowa “cacheowane” bo ktoś mógłby pomyśleć, że faktycznie named_scope jakoś to keszuje. A nie robi tego. Po prostu wywołanie:

named_scope :active, :conditions => ["expire > ?", Time.zone.now]

w definicji klasy jest ewaluowane tylko jeden raz (własnie podczas definicji klasy), stąd wartość przekazanego parametru będzie zawsze taka sama. Natomiast podając jako parametr lambdę/proc named_scope zewaluuje go (wywoła) za każdym wywołaniem i dopiero to co on zwróci użyje jako opcje, zatem za każdym razem może dostać inne wartości.