Rails:按小时创建跟踪用户的created_at和ip地址

时间:2014-08-08 13:36:33

标签: ruby-on-rails ruby postgresql group-by

我有以下impression模型,可跟踪应用内的所有用户互动:

class Impression
  belongs_to :user
end

create_table :impressions do
  t.string :ip_address
  t.integer :user_id
  t.datetime :created_at
end

我需要显示按ip_addresscreated_at(每小时)分组的所有展示次数

假设用户今天随机点击某个页面10 times,我们就会存储10 impressions。这些展示中的每一个都有ip_address和时间戳。

查询结果应该是:

created_at          user_id         ip_address   count
10/08/2014 6pm            1          127.0.0.1       2
10/08/2014 4pm            1          127.0.0.1       4
10/08/2014 1pm            1          127.0.0.1       2
10/08/2014 1pm            1          82.125.121.101  1
10/08/2014 10am           1          127.0.0.1       1

在此示例中,展示次数总和为10,这是正确的。

1pm左右,用户访问应用程序3次,在localhost中访问两次,使用ip_address 82.125.121.101访问一次。

到目前为止,这是我的查询:

Impression.where(user_id: 1).group_by_hour(:created_at).group(:ip_address).size.order('created_at desc')

但结果既没有排序created_at desc也没有正确计数。

我使用以下groupdate gem https://github.com/ankane/groupdate按小时分组。

1 个答案:

答案 0 :(得分:0)

如果您正在使用postgresql,则可以使用date_trunc

  SELECT date_trunc('hour', created_at) AS h, ip_address, COUNT(*)
    FROM users
GROUP BY h, ip_address

与您的实际问题无关,但postgresql内置了一个IP地址数据类型,您可以使用该数据类型代替字符串。我认为使用它的主要原因只是在您插入记录时强制它是一个有效的IP地址。