Ruby on rails 返回Rails中按时间间隔分组的对象?

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' => [

我有一个叫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' => [...], '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]你用的是什么?