Будет ли это работать с named_scope в рельсах? - PullRequest
2 голосов
/ 02 марта 2011

Я не могу найти ответ на этот вопрос нигде, и у меня не осталось мозгов сегодня, чтобы придумать способ подтвердить это самостоятельно.

У меня есть именованная сфера, подобная этой...

named_scope :fresh, :conditions => ['updated_at > ?', 4.hours.ago]

И я не знаю, будет ли это работать так, как я хочу.Часть меня думает, что 4.hours.ago будет разрешен при загрузке файла класса, а другая часть думает, что 4.hours.ago будет расширяться при его использовании.

Спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 02 марта 2011

Вам нужно будет использовать лямбду:

named_scope :fresh, lambda { { :conditions => ['updated_at > ?', 4.hours.ago] } }

Причина, по которой вам нужно использовать лямбду, заключается в том, что области загружаются при запуске приложения.Из-за этого время в вашей области будет отражать время, в которое ваша область была загружена.Так что может показаться, что это сработает, но со временем станет все более и более неправильным.Вставляя лямбду, вы сообщаете, что хэш условий должен выполняться каждый раз, когда вызывается область.Поэтому время звонка не устареет.

2 голосов
/ 02 марта 2011
class Person < ActiveRecord::Base
  named_scope :stale, :conditions => ['updated_at > ?', 4.hours.ago]
  named_scope :fresh, lambda {{ :conditions => ['updated_at > ?', 4.hours.ago] }}
end

производит:

> Person.stale
  SELECT * FROM "people" WHERE (updated_at > '2011-03-01 20:57:40') 
> Person.stale
  SELECT * FROM "people" WHERE (updated_at > '2011-03-01 20:57:40') # no change
> Person.fresh
  SELECT * FROM "people" WHERE (updated_at > '2011-03-01 20:57:59') 
> Person.fresh
  SELECT * FROM "people" WHERE (updated_at > '2011-03-01 20:58:01') 
...