条件参数需要是一段SQL。
:条件 => ["when.wday=4"]
是一段 Ruby 代码,所以不要去。
试试
# Model Event has a datetime field named 'when'
Event.find(:all, :conditions => ["strftime('%w', events.when) = 4"])
SQLLite 参考: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...