我有一个名为Tweet的模型。
每个Tweet对象都有一个名为tweet_created_at的属性,它基本上表示该推文的发布时间。
我想做一个查询,按时间间隔返回推文,所以最后我想:
tweets_by_interval = { 'from_0_to_3' => [TweetObject1, TweetObject2..], 'from_4_to_7' => [...], 'from_8_to_11' => [...], 'from_12_to_15' => [...], 'from_16_to_19' => [...], 'from_20_to_23' => [...] }
因此哈希中的每个成员都意味着:那些从小时X到小时Y创建的推文。
如何使用ActiveRecord查询界面执行此操作?
答案 0 :(得分:2)
您可以使用ActiveRecord / SQL或Ruby执行此操作。您可以使用group_by
方法使用后一种方法,如下所示:
TIME_INTERVALS = (0...24).collect {|hour| base = hour-hour%4 ; "from_#{base}_to_#{base+3}".to_sym}
def interval(time)
TIME_INTERVALS[time.hour]
end
Tweet.all.group_by {|tweet| interval(tweet.tweet_created_at)}
我用以下方法对此进行了测试:
class Tweet
def initialize
@time = DateTime.new(1,1,1,rand(24))
end
def self.all
15.times.collect {Tweet.new}
end
def tweet_created_at
@time
end
def inspect
'Tweet'+@time.hour.to_s
end
end
产生:
=> {:from_4_to_7=>[Tweet5, Tweet7, Tweet7], :from_12_to_15=>[Tweet13, Tweet13, Tweet14], :from_0_to_3=>[Tweet2, Tweet2], :from_20_to_23=>[Tweet22, Tweet20, Tweet21], :from_8_to_11=>[Tweet10, Tweet9, Tweet10], :from_16_to_19=>[Tweet17]}