【问题标题】:Can you specify a date range for chartkick?你可以为chartkick指定一个日期范围吗?
【发布时间】:2020-03-13 07:37:34
【问题描述】:

我正在使用 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 能否以某种方式访问​​这些参数?

在我的代码中,Club 有许多 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

我正在尝试做的事情可能吗?

【问题讨论】:

标签: ruby-on-rails chartkick


【解决方案1】:

我在您的 cmets 中发布了一篇精彩文章的链接,但您也可以使用名为 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 方法。

【讨论】:

  • 我可以看到这将如何让我选择特定范围的数据,但是我需要用户能够从前端选择范围。
  • 他们在这里展示了 sitepoint.com/graphs-on-rails-chartkick-in-practice 如何在前端使用日期选择器。将参数发送到您的控制器,在一个简单的 where 子句中查询,然后使用 group_by 收集数据
  • 为什么不使用 datepicker 插件,然后将这 2 个输入字段包装在一个表单中。表单的 url 是您要过滤的实际视图。在您的控制器中,您可以从字符串中解析日期,就像我展示的显示操作一样。您可能还需要Date.parse(params[:start_date]) 或类似的东西
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多