#ruby-on-rails #ruby #date #named-scope
#ruby-on-rails #ruby #Дата #именованная область
Вопрос:
Работаю с приложением Rails 2.3.9 и задаюсь вопросом, как написать мой named_scope так, чтобы я получал только workouts
с текущей даты. Я устанавливаю часовой пояс в контроллере приложения с помощью before_filter. Приведенное ниже не выдает ошибку, просто не фильтрует:
workout.rb
named_scope :today_only, :conditions => [ "workouts.created_at <= ? AND workouts.created_at >= ?", Time.zone.now, 1.days.ago ]
application_controller.rb
before_filter :set_user_time_zone
Комментарии:
1. Вы пытаетесь передать свои именованные переменные области видимости?
2. Попробуйте использовать лямбда-блок в вашем named_scope. Возможно, проблема в кэшировании.
Ответ №1:
Вы не видите желаемых ответов, потому что Ruby оценивает ваш вызов Time.now, когда он оценивает ваше определение класса, а не когда вы вызываете область. Вам нужно передать lambda
вашему named_scope
вызову, чтобы он выполнял оценку при каждом запросе:
# ensure that Time.now is evaluated on every call
named_scope :today_only, lambda {{ :conditions => ["workouts.created_at BETWEEN ? AND ?", Time.zone.now.at_beginning_of_day, Time.zone.now.end_of_day ] }}
Кроме того, я думаю, что ваши временные границы могут быть неверными. Вы ищете workouts
те, которые были созданы за последние 24 часа (относительно Time.now), или только тренировки, которые были созданы «сегодня»? Ваш пример работает для первого, приведенный выше пример работает для второго.
Комментарии:
1. Все это имеет смысл, и я хочу, чтобы это было позже. Но… Я получаю эту ошибку, когда я помещаю ее в:
undefined method 'at_start_of_day' for Fri Apr 22 08:52:58 UTC 2011:Time
2. ПОДТВЕРЖДЕНИЕ! Извините, метод на самом деле `at_beginning_of_day’