是否可以执行仅查看日期时间字段的时间部分的 activerecord 查询?
e.g. Battle.where('start_time < ? and 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 属性保存战斗模型之前设置此值。
EDIT
顺便说一句,如果您使用 PostgreSQL,它能够在函数结果上创建索引,因此,如果您不介意必须坚持使用 PostgreSQL,您可以只使用 SQL 函数。在你问之前,不,我不知道它是如何工作的,我只知道数据库允许你这样做,而这在 MySQL 上不可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)