我正在使用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
我想做的是可能的吗?
答案 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
方法上方那样调用。