Параметр условий должен быть фрагментом SQL.
: условия => ["when.wday = 4"]
- это фрагмент кода Ruby, поэтому не стоит.
Попробуйте
# Model Event has a datetime field named 'when'
Event.find(:all, :conditions => ["strftime('%w', events.when) = 4"])
SQLLite ref: http://www.sqlite.org/lang_datefunc.html
Добавлено:
При более внимательном чтении вашего поста, я думаю, вы планируете отправлять несколько переменных экземпляра (по одной в день недели) с вашего контроллера на ваше представление. Это хорошая идея - вывести логику из поля зрения. Но , не делайте больше запросов DBMS!
Каждый запрос имеет значительные накладные расходы. Например:
#Do NOT do it this way (too many db queries)
@sunday_events = Event.find(:all,
:conditions => ["strftime('%w', events.when) = 0"])
@monday_events = Event.find(:all,
:conditions => ["strftime('%w', events.when) = 1"])
@thursday_events = Event.find(:all,
:conditions => ["strftime('%w', events.when) = 4"])
# ... etc
# Better: Just 1 database query--
events = Event.find(:all)
@sunday_events = events.select{|e| e.when.wday == 0}
@monday_events = events.select{|e| e.when.wday == 1}
@thursday_events = events.select{|e| e.when.wday == 4}
# ... etc
Окончательный комментарий:
В настоящее время передовой практический подход заключается в переносе кода в модели с контроллеров, где это целесообразно. Это называется «Толстая модель, тощий контроллер». В приведенном выше примере вы можете использовать метод уровня класса , в модели создать отдельные переменные экземпляра. Или, может быть, лучше, один хеш, который содержит 7 значений, каждое из которых представляет собой массив записей. Например,
# in Event model
def Event.find_by_day
events = Event.find(:all)
result = {}
days = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
(0..6).each{|day_i| result[days[day_i]] =
events.select{|e| e.when.wday == day_i}
}
result
end
# in controller
@events = Event.find_by_day
# in view
# @events[:sun] is array of the Sunday events
# so do something with them...