2014-01-08 39 views
4

的小時數這裏是我的模型:如何組記錄由

Interaction.rb

class Interaction < ActiveRecord::Base 

    belongs_to :report 
    belongs_to :post 
    belongs_to :fb_user 
    has_one :fb_page 

Report.rb

class Report < ActiveRecord::Base 

    belongs_to :user 

    has_many :page_stats, 
    dependent: :destroy 
    has_many :interactions, 
    dependent: :destroy 
    has_many :fb_users, 
    through: :interactions 
    has_one :fb_page, 
    foreign_key: :fb_id, 
    primary_key: :fb_page_id 
    has_many :posts, 
    dependent: :destroy 

FbUser.rb

class FbUser < ActiveRecord::Base 

    self.primary_key = "id" 
    has_many :interactions 

我想要做的是羣Inte按照他們發生的一天中的時間進行。我正在尋找1-24(一天中的小時,UTC)的散列,並將它們發生時的相互作用計數進行分組。

下面是一個例子返回值:

{{1 => 23},{2 => 7},{N => X}}

基本上,對於每小時1,有23間相互作用,第二小時,有7個。我想爲每個1到24小時做這個。

交互有一個名爲「interaction_time」的列,它是發生交互時。感謝

+0

的數據庫您使用的? – usha

+0

postgres ...所以我猜sql? –

+0

修改了我對postgres的回答 – usha

回答

6

Postgres的,

Interaction 
.select('EXTRACT(HOUR from interaction_time)') 
.group('EXTRACT(HOUR FROM interaction_time)') 
.order('EXTRACT(HOUR from interaction_time)') 
.count 
+0

這個效果很好,雖然我想從0-23開始通過interaction_time來排序結果。但是我不斷收到錯誤,如「PG :: GroupingError:錯誤:列」interact.interaction_time「必須出現在GROUP BY子句中或用於聚合函數中」 –

+0

@Matthew Berman:修改我的答案以包含順序。測試它,似乎工作 – usha

+0

對於MySQL試試這個'ATransaction.where('recordTime> =?',1.month.ago).group(「hour(recordTime)」)。count' – PackedUp

1

所以......在你的交互模型創建的方法:

def hour 
    self.interaction_time.to_date.strftime('%H') 
end 

將從0-23回到你的模型。將它們分組:

@user = FbUser.find(params[:id]) 
hours_of_day = @user.interactions.group_by(&:hour) 

發揮與陣列現在... hours_of_day.keys,hours_of_day.values , .size`等

的關鍵應該是小時,則該值應該是一個數組發生在這一個小時的不同互動

hours_of_day.each do |key, value| 
    puts key 
    puts value.size 
end 

類似的東西...