2009-12-29 2 views
1

У меня есть модель, которая имеет 2 свойства: valid_from и valid_to.Используйте те же параметры много раз в условиях поиска: hash

Мне нужно выбрать все экземпляры, которые в настоящее время действительны, то есть valid_from < = сегодня и valid_to> = сегодня.

я иметь следующую находку:

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]) 

Есть ли способ улучшить и сделать только один вызов переменной в соответствии со всеми параметрами?? в: условиях?

спасибо, П.

+0

Да, но второй фрагмент кода более оптимизирован, как у не нужно сделать расчет дважды ... – khelll

+0

OK спасибо, но есть ли способ набрать только один раз «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

Проблема с использованием Date.today внутри named_scope. Это связано с тем, что область имен скомпилирована, когда сначала скомпилирована модель 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)]} }