如何编写仅查看日期时间字段的时间组件的activerecord查询?
是否可以执行仅查看日期时间字段的时间组件的activerecord查询?
例如Battle.where('start_time ?','12:00','06:00')
找到所有在早上6点到中午12点之间开始的战斗而不管它们发生的那一天? 在此示例中,start_time被定义为日期时间。
唯一的方法是使用SQL函数,如果你在MySQL上,你可以这样做:
Battle.where( 'HOUR( start_time ) >= ? AND HOUR( start_time ) <= ?', 12, 6 )
但这是非常低效的,并且总是会生成全表扫描 ,你肯定不希望这样。
最好的解决方案是在战斗模型中添加仅包含小时值的列,索引它们并直接在它们上查询,如下所示:
Battle.where( 'start_time_hour >= ? start_time_hour <= ?', 12, 6 )
只需添加一个before_save回调,在基于start_time属性保存Battle模型之前设置此值。
编辑
顺便说一下,如果你正在使用PostgreSQL,它能够在函数结果上创建索引,所以,如果你不介意必须坚持使用PostgreSQL,你可以使用SQL函数。 在你问之前,不,我不知道它是如何工作的,我只知道数据库允许你这样做,而这在MySQL上是不可用的。
- ActiveRecord语法,用于在使用连接时查找平均评级为x或更高的所有项目
- Ruby on Rails:关于validates_presence_of的问题
- Hstore和Rails
- Rails 5 db migration:如何修复ActiveRecord :: ConcurrentMigrationError
- 如何最好地处理与ActiveRecord的每个模型数据库连接?
- Rails 4 x paper_trail:使用嵌套资源按item_id过滤版本
- 为什么Rails忽略(伪)嵌套事务中的回滚?
- 将Datamapper与现有的rails应用程序一起使用
- 在gem中转换ActiveRecord的扩展名