为了好玩,我想看看(在Rails数据库中)在特定的时间范围内(具体地说是2AM-5AM)创建的一组用户,但在任何一天。它们都有典型的created_at字段。我想我知道如何为一个用户从这个字段中提取小时,然后看看它是否在一个范围内——但我如何为所有用户做到这一点?我应该循环浏览一下吗?(就在我写的时候,这听起来很天真)。
# app/models/user.rb
class User < ActiveRecord::Base
# ...
def self.get_users_created_between(start_time, end_time)
User.where("TIME(created_at) BETWEEN TIME(?) AND TIME(?)", start_time, end_time)
end
# ...
end
并像这样使用:
irb> User.get_users_created_between(Time.parse("2pm"), Time.parse("5pm"))
这为您提供了几个好处:
- 您可以在整个代码中重用它,而不必担心where或时间范围的语法
- 如果rails出于某种奇怪的原因决定为此更改接口,那么您只需要编辑一个方法,而不需要在整个项目的一千个地方编写代码
- 如果你觉得user.rb变得很大,你可以很容易地将这段代码从user.rb中移出。也许是一些专用的查找器或查询类。或者类似于存储库模式
PS:时间函数可能因不同的DBMS而异,如MySQL、Postgresql、MSSQL等。我不知道是否有通用的方法。这个答案适用于MySQL。
试试这个,
User.where(created_at: Time.parse("2pm")..Time.parse("5pm"))
或者类似的东西
User.select { |user| user.created_at.hour.between?(2, 5) }
要返回在任何一天的两个小时内创建的用户,请使用以下命令:
User.where('HOUR(created_at) BETWEEN ? AND ?', 2, 5)
请注意,HOUR(created_at)
仅适用于MySQL。Postgresql中的语法是SQLite中的extract(hour from timestamp created_at)
和strftime('%H' created_at)
。