问题
I'm using chartkick in an active admin dashboard and trying to track a cumulative user base over time.
Using groupdate to count by week I can successfully create a chart displaying point in time counts but struggling to display cumulative results.
Any suggestion on best way to approach as I have not found a similar question?
chart partial
<%= javascript_include_tag "https://www.gstatic.com/charts/loader.js" %>
<%= line_chart User.group_by_week(:created_at).count %>
dashboard.rb
column do
panel "Recent User Additions" do
table_for User.order("id desc").limit(10).each do |_user|
column(:email) { |user| link_to(user.email, admin_user_path(user)) }
column(:state_waters) { |user| link_to(user.state_waters, admin_user_path(user)) }
column(:state_waters) { |user| link_to(user.home_port, admin_user_path(user)) }
end
end
回答1:
If I understand your question, you need to manipulate the hash of data.
In controller do somehing like this:
@data = User.group_by_week(:created_at).count
accumulator = 0
@data.transform_values! do |val|
val += accumulator
accumulator = val
end
Then show the chart in view as <%= line_chart @data %>
If you inspect the hash <%= User.group_by_week(:created_at).count.inspect %>
it becomes clear.
In order to use accumulator over any hash, could be useful to add a custom method to Class hash.
module HashPatch
def accumulate_values!
accumulator = 0
transform_values! do |val|
val+= accumulator
accumulator = val
end
end
end
Hash.include HashPatch
points = {'x1' => 0, 'x2' => 10, 'x3' => 10, 'x4' => 10.1}
points.accumulate_values! #=> {"x1"=>0, "x2"=>10, "x3"=>20, "x4"=>30.1}
transform_values!
since Ruby v4.2.1
来源:https://stackoverflow.com/questions/51142556/rails-chartkick-cummulative-user-graph