Ruby on rails 返回Rails中按时间间隔分组的对象?
我有一个叫Tweet的模型 每个Tweet对象都有一个名为Tweet_created_的属性,该属性基本上表示该Tweet发布的时间 我想做一个查询,按时间间隔返回Tweets,因此最后我想:Ruby on rails 返回Rails中按时间间隔分组的对象?,ruby-on-rails,Ruby On Rails,我有一个叫Tweet的模型 每个Tweet对象都有一个名为Tweet_created_的属性,该属性基本上表示该Tweet发布的时间 我想做一个查询,按时间间隔返回Tweets,因此最后我想: tweets_by_interval = { 'from_0_to_3' => [TweetObject1, TweetObject2..], 'from_4_to_7' => [...], 'from_8_to_11' => [...], 'from_12_to_15' => [
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小时创建的tweet
如何使用ActiveRecord查询接口实现这一点?您可以使用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],: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]
你用的是什么?