您可以指定图表行销的日期范围吗?

时间:2019-11-17 22:56:42

标签: ruby-on-rails chartkick

我正在使用chartkick创建一些折线图以可视化我的Rails应用程序中的数据。然而,目前,它显示了我数据库中的所有数据。显然,这并不总是理想的。我想让用户能够指定所显示数据的日期范围。我将使用记录的created_at值。

我在文档中找不到有关如何执行此操作的说明。

https://github.com/ankane/chartkick.js?files=1

我创建了一个日期选择器,它将为我提供一个http://localhost:3000/metrics?utf8=%E2%9C%93&search%5Bdate_from%5D=2019-11-01&search%5Bdate_to%5D=2019-11-17&commit=Search

这样的URL。

Chartkicker可以通过某种方式访问​​这些参数吗?

在我的代码中,俱乐部拥有许多DailyMetrics,并且我在clubs控制器中创建了一个指标操作。

查看

<%= javascript_include_tag "https://google.com/jsapi" %>

<div class="row">
  <h1>Metrics</h1>
  <div class="pull-right range-query">
    <%= form_tag metrics_path, method: :get do %>
      <%= text_field_tag 'search[date_from]', @search.date_from %>
      <%= text_field_tag 'search[date_to]', @search.date_to %>
      <%= submit_tag 'Search', class: 'btn search-button' %>
    <% end %>
  </div>
</div>

<h3>Total active students</h3>
<%= line_chart @club.daily_metrics.group(:created_at).sum(:total_active_students), library: { animation: { easing: 'easeOutQuad'}} %>
<h3>Lost students</h3>
<%= line_chart @club.daily_metrics.group(:created_at).sum(:lost_students), library: { animation: { easing: 'easeOutQuad'}} %>
<h3>New students</h3>
<%= line_chart @club.daily_metrics.group(:created_at).sum(:new_students), library: { animation: { easing: 'easeOutQuad'}} %>

控制器

def metrics 
  @club = current_club
  @search = MetricSearch.new(params[:search])
  @metrics = @search.scopeContr
end

用于搜索指标的模型

class MetricSearch
    attr_reader :date_from, :date_to

    def initialize(params)
        params ||= {}
        @date_from = parsed_date(params[:date_from], 7.days.ago.to_date.to_s)
        @date_to = parsed_date(params[:date_to], Date.today.to_s)
    end

    def scope
        DailyMetric.where('created_at BETWEEN ? AND ?', @date_from, @date_to)
    end

    private

        def parsed_date(date_string, default)
            Date.parse(date_string)
        rescue ArgumentError, TypeError
            default
        end
end

我想做的是可能的吗?

1 个答案:

答案 0 :(得分:2)

我在您的评论中张贴了一篇很棒的文章的链接,但是您也可以使用名为gem 'groupdate'的gem。

# Gemfile
gem 'groupdate'

假定您的用户模型has_many :orders,并希望了解他们在过去6个月内的支出:

# order.rb
def self.monthly_spending
  group_by_month(:date, last: 6, current: false).sum('orders.total')
end

您认为:

<%= line_chart current_user.orders.monthly_spending %>

这里是另一个tutorial how to group by date with chartkick and groupdate gem

如果您要预选择查询的起始日期,则可以在前端设置日期选择器,并将参数发送到控制器

def show
  orders = Order.where('created_at > %s AND created_at < %s', params[:start_date], params[:end_date])
end

像在预先过滤的订单列表上的group_by方法上方那样调用。