[help]RoR,Chartkick,包含所有用户和每个用户的背书数量的条形图

[help]RoR, Chartkick, bar chart with all users and number of endorsements for each

编辑:我现在已经 3 个多星期了,我似乎无法在不制造更多问题的情况下解决问题。有好心人帮我看看吗??


我想创建一个条形图,列出所有用户和他们的认可数量。还可以对每个数字进行向下钻取以显示用户在当年每个月获得的认可数量。喜欢:

用户 1 - 5

用户 2 - 8

用户 3 - 3

点击每个数字将向下钻取并显示点击用户的数据,如下所示:

1 月 - 2

二月 - 2

3 月 - 1

我完全迷路了,不知道如何解决这个问题,所以非常感谢您的帮助。

在我看来,我所做的只是显示一个空白图表,下面列出了用户:

<% provide(:title, "Statistics") %>
<h1>Statistics</h1>

<%= bar_chart @users.group(:name) %>

<% end %>

我正在使用 chartkick 和 dateslices 而不是 groupdate,因为我使用的是 SQlite。

此外,要获得认可的数量,我必须执行以下操作:

<% @users.each do |user| %>
  <ul class="user">
    <%= user.name %>
    <%= user.inbound_endorsements.count %>
  </ul>

@users 基本上是 User.all

你可以看到下面的关系。


现在一些关于我的用户和认可的信息controllers/models删除了部分不相关的信息,如密码设置等

用户模型:

class User < ActiveRecord::Base
  has_many :inbound_endorsements, class_name: "Endorsement",
                                 foreign_key: "endorsed_user_id",
                                 dependent: :destroy
  has_many :outbound_endorsements, class_name:  "Endorsement",
                                  foreign_key: "endorsing_user_id",
                                  dependent:   :destroy
  has_many :endorsing_users, through: :inbound_endorsements, source: :endorsing_user
  has_many :endorsed_users, through: :outbound_endorsements, source: :endorsed_user

.
.
.

  # Endorses a user.
  def endorse(other_user, comment)
    outbound_endorsements.create(endorsed_user_id: other_user.id, comment: comment)
  end

  # Unendorses a user.
  def unendorse(other_user)
    outbound_endorsements.find_by(endorsed_user_id: other_user.id).destroy
  end

  # Returns true if this is endorsing the other user.
  def endorsing?(other_user)
    Endorsement.current.exists?(endorsing_user: self, endorsed_user: other_user)
  end

  # Returns true if this can endorse other user.
  def can_endorse?(other_user)
    if (current_outbound_endorsements_count < 3)
      unless endorsing?(other_user)
        return true
      end
    end
    return false
  end

  def current_outbound_endorsements_count
    outbound_endorsements.current.count
  end

.
.
.

代言模特:

class Endorsement < ActiveRecord::Base
  belongs_to :endorsing_user, class_name: "User"
  belongs_to :endorsed_user, class_name: "User"
  validates :endorsing_user_id, presence: true
  validates :endorsed_user_id, presence: true
  validates :comment, presence: true, length: { maximum: 140}
  scope :current, -> { where(created_at:  (Time.now.beginning_of_month..Time.now)) }
end

这是我的 static_pages 控制器,只为我希望显示图表的统计页面定义了这个:

class StaticPagesController < ApplicationController
  before_filter :require_user, :require_admin, only: :statistics

  def home
    if logged_in?
    end
  end

  def statistics
    @users = User.all
    @endorsements = Endorsement.all
  end

  def help
  end

  def about
  end

  def contact
  end
end

任何帮助和提示将不胜感激!

也许有更简单的方法来做到这一点?如果你知道,请告诉我!

2 个月后,我设法解决了我的问题。嗯,不完全是,我无法进行深入分析,但设法为所有有背书的用户制作了一个简单的条形图,0 的用户是未显示。

我是这样做的:

在统计页面的静态页面控制器中,我做了这样的事情:

def statistics
    @users = User.all
    @endorsements = Endorsement.all
    @data = @users.map { |user|
            amount = user.inbound_endorsements.joins(:endorsed_user).group(:name).count
              if !amount.empty?
                {name: user.name, data: amount}
              end
            }
  end

在我的统计数据中,我做了这个:

<% provide(:title, "Statistics") %>
<h1>Statistics</h1>
<%= pie_chart({"Users" => @users.count, "Endorsements" => @endorsements.count}) %>
<%= column_chart @data.compact, library: {yAxis: {allowDecimals: false}} %>

@data.compact 从散列中删除了 nil 值,导致散列看起来像这样:

[{:name=>"Jess Corwin", :data=>{"Jess Corwin"=>1}}, {:name=>"Rhiannon Nicolas", :data=>{"Rhiannon Nicolas"=>1}}, {:name=>"Assunta Pfeffer", :data=>{"Assunta Pfeffer"=>2}}, {:name=>"Rafaela Farrell", :data=>{"Rafaela Farrell"=>1}}, {:name=>"Maurine Hettinger", :data=>{"Maurine Hettinger"=>1}}] 

这些数据产生了这样的图表:

满意。希望有一天这对某人有所帮助。