[帮助] RoR,Chartkick,包含所有用户的条形图和每个用户的认可数量

时间:2016-03-05 14:34:25

标签: ruby-on-rails charts chartkick

编辑:我已经过了3个星期了,而且我似乎无法解决问题而不会遇到更多问题。任何人都可以这么善良,请看看吗?

我想创建一个条形图,列出所有用户及其代言人数。很高兴能够对每个数字进行深入分析,以显示用户在当年每个月获得的认可数量。像:

User1 - 5

User2 - 8

User3 - 3

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

1月2日

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

您可以看到以下关系。

现在有关我的用户和代言控制器/型号的一些信息,其中包含一些不相关的信息,例如密码设置和

用户型号:

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

非常感谢任何帮助和提示!

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

1 个答案:

答案 0 :(得分:1)

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}}] 

这些数据产生了如下图表:

enter image description here

哪个是令人满意的。希望有一天能帮助别人。