ruby-on-rails - 有没有模型分析 gem ?

标签 ruby-on-rails rubygems

我正在努力允许客户查看一段时间内每天、每周、每月的分析数据,按小时、天或月等分组......所有这些都基于 created_at 属性。

是否有任何 gem 已经可以做到这一点?像这样的东西:

Posts.analytics(:by => :day, :period => :this_week, :column => :created_at)

将返回:

{
'2012-06-19' => 14,
'2012-06-20' => 0, // Empty rows padding support*
'2012-06-21' => 3
}

我正在尝试从头开始制作它,但如果已经有一个 gem 可以完成这项工作,那么这似乎是很多不必要的工作。

更新

我试图制作一个分析模块,将其包含在所有模型中以方便分析生成,但它确实不可靠,有时我得到的天数比我需要的多,而且它真的很困惑,任何人都可以合作并重写/改进这一点:

# Usage:
# include Analytics::Timeline
# Model.timeline(:period => :last_24_hours, :time_by => :hour)

module Analytics
  module Timeline
    def self.included(base)
      base.class_eval {

        def self.timeline(*filters)
          filters = filters[0]
          period  = filters[:period] || :this_week
          time_by = filters[:time_by] || :days
          date_column = filters[:date_column] || :created_at

          # Named periods conventions
          period_range = case period
            when :last_12_hours
              [Time.now-12.hours, Time.now]
            when :last_24_hours
              [Time.now-24.hours, Time.now]
            when :last_7_days
              [Time.now-7.days, Time.now]
            when :last_30_days
              [Time.now-30.days, Time.now]
            when :this_week
              [Time.now.beginning_of_week, Time.now.end_of_week]
            when :past_week
              [(Time.now - 1.week).beginning_of_week, (Time.now - 1.week).end_of_week]
            when :this_month
              [Time.now.beginning_of_month, Time.now.end_of_month]
            when :past_month
              [(Time.now-1.month).beginning_of_month, (Time.now - 1.month).end_of_month]
            when :this_year
              [Time.now.beginning_of_year, Time.now.end_of_year]
            end
          period_range = period if period.kind_of?(Array)
          period_range = [period, Time.now] if period.is_a?(String)

          # determine the SQL group method
          group_column = case time_by
            when :months
              time_suffix = "-01 00:00:00"
              records = where("#{table_name}.#{date_column} > ? AND #{table_name}.#{date_column} <= ?", period_range[0].to_date, period_range[1].to_date)
              "DATE_FORMAT(#{table_name}.#{date_column.to_s}, '%Y-%m')"
            when :days
              time_suffix = " 00:00:00"
              records = where("#{table_name}.#{date_column} > ? AND #{table_name}.#{date_column} <= ?", period_range[0].to_date, period_range[1].to_date)
              "DATE(#{table_name}.#{date_column.to_s})"
            when :hours
              time_suffix = ":00:00"
              records = where("#{table_name}.#{date_column} > ? AND #{table_name}.#{date_column} <= ?", period_range[0], period_range[1])
              "DATE_FORMAT(#{table_name}.#{date_column.to_s}, '%Y-%m-%d %H')"
            when :minutes
              time_suffix = ":00"
              records = where("#{table_name}.#{date_column} > ? AND #{table_name}.#{date_column} <= ?", period_range[0], period_range[1])
              "DATE_FORMAT(#{table_name}.#{date_column.to_s}, '%Y-%m-%d %H:%M')"
            end

          # Get counts per cycle
          records = records.group(group_column).select("*, count(*) AS series_count, #{group_column} AS series_time")
          series = {}

          # Generate placeholder series
          time_table = { :days => 60*60*24, :hours => 60*60, :minutes => 60, :seconds => 0 }

          if time_by == :months
            ticks = 12 * (period_range[1].year - period_range[0].year) + (period_range[1].month + 1) - period_range[0].month
          else
            ticks = (period_range[1] - period_range[0] + 1) / time_table[time_by]
          end

          ticks.to_i.times do |i|
            time = period_range[1]-i.send(time_by)
            time = case time_by
            when :minutes
              time.change(:sec => 0)
            when :hours
              time.change(:min => 0)
            when :days
              time.change(:hour => 0)
            when :months
              time.change(:day => 1, :hour => 0)
            end

            series[time.to_s(:db)] = 0
          end

          # Merge real counts with placeholder series
          to_merge = {}
          records.each do |r|
            to_merge[r.series_time.to_s+time_suffix] = r.series_count
          end

          series.merge!(to_merge)
        end

      }
    end
  end
end

最佳答案

ActiveRecord statistics gem看来它对你真的很有用。

如果统计 gem 没有帮助,admin_data gem内置了一些分析功能。查看 the demo 。使用整个管理系统可能有点过分,但您至少可以尝试浏览源代码来模仿分析功能。

关于ruby-on-rails - 有没有模型分析 gem ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250686/

相关文章:

ssl - 无法从 ruby​​gems 下载数据

ruby-on-rails - Rails 3 和加密字符串 Gem - 获取 OpenSSL::Cipher::CipherError: bad decrypt error

ruby-on-rails - 如何使用范围连接多个表

ruby-on-rails - Rails remotipart gem,如何绑定(bind)到 ajax "progress"事件

ruby-on-rails - ActionView::Template::Error(无法打开到本地主机的 TCP 连接:9292(连接被拒绝 - 连接(2)用于 "localhost"端口 9292))

ruby-on-rails - 无法安装 Nokogiri

ruby-on-rails - rails 数据库 :migrate with postgres running in a container

ruby-on-rails - Rails gem 将一段分成一系列句子

ruby-on-rails - 如何更改在 OS 10.6.6 Ruby 1.8 和 Rails 3 上安装 ruby​​ gems 的路径

mysql - 在 Ruby 中安装 MYSQL Gems 时出错