javascript - 将 Rails 中的记录分组为图表?

标签 javascript ruby-on-rails highcharts model

已解决

我有一个饼图:

enter image description here

data: [<% HomeworkStudent.where(:school_user_id => current_user.school_user.id).each do | homework_student| %>
            [<%= homework_student.homework.classmodule.subject.to_json.html_safe %>, <%= homework_student.difficulty.to_json %>],
            <% end %>]
    }]

数据绘制得很好,但我希望按主题对“难度”进行分组。换句话说,数学和艺术在图表上应该只有一次。这是 highcharts 图表。

我还通过我的模型尝试了以下不同的方法,但它不起作用:

作业.rb

def self.getData
    data = []
    self.subjectnames.each do |type2|
      data << Hash["name", type2, "y", self.type2_count(type2)]
    end
    data
  end

...
private

def self.subjectnames
    Classmodule.pluck(:homework_id).uniq
  end

   def self.type2_count(type2)
    HomeworkStudent.where(difficulty: type2).count
  end

然后在图表中像这样:

Controller 

@data = Homework.getData()

View: 

data: <%= @data.to_json.html_safe %>

后一种路线是理想的路线,但由于涉及不同的模型,所以有点困惑。

有3个模型:Classmodule保存科目名称,homework_student保存难度列和homework_id列。

homework.rb
has_many :homework_students, :class_name => 'HomeworkStudent', dependent: :destroy
    belongs_to :classmodule, :class_name => 'Classmodule', :foreign_key => :subject

classmodule.rb
    has_many :homeworks, :class_name => 'Homework'

homework_student.rb:
belongs_to :classmodule, :class_name => 'Classmodule', :foreign_key => :subject

虽然不理想,而且我更愿意正确地做到这一点,但我现在在顶部的方法有效,但我只是想知道如何按主题对结果进行分组?如果我必须为此检查模型有什么建议吗?

谢谢!

已解决

感谢 Ruby Racer:

在 Controller 中:

@data = {}
        HomeworkStudent.where(:school_user_id => current_user.school_user.id).each do |homework_student|
        label = homework_student.homework.classmodule.subject
        value = homework_student.difficulty.to_i
    @data[label] = (@data[label]) ? (@data[label] + value) : value
end

在 View 中的图表中:

data: <%= @data.to_a.to_json.html_safe %>

最佳答案

在不深入模型的情况下,我会选择这样的东西:

@data = {}
HomeworkStudent.where(:school_user_id => current_user.school_user.id).each do |homework_student|
    label = homework_student.homework.classmodule.subject
    value = homework_student.difficulty
    @data[label] = (@data[label]) ? (@data[label] + value.to_i) : value.to_i
end

现在@data看起来有点像这样:

@data
# {"art"=>90, "math"=>200}
@data.to_a
# [["art", 90], ["math", 200]]

这很像您所需要的。现在您只需将其转换为 json 和 html 安全

newdata = @data.map {|subject, difficulty| [subject.to_json.html_safe, difficuty.to_json]}

但你并不真的需要那个。因此,您将 ruby​​ 数组发送到 js:

data: <%= @data.to_a.inspect.html_safe %>

或者,更好的是:

data: <%= @data.to_a.to_json.html_safe %>

关于javascript - 将 Rails 中的记录分组为图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41665514/

相关文章:

javascript - 使文字对象具有参数?

javascript - 在不修改原型(prototype)的情况下扩展核心类型

javascript - 尝试在我的 Rails 应用程序中截屏页面时 PhantomJS.rb 卡住

ruby-on-rails - 如何在不使用包含的情况下避免 n + 1?

ruby-on-rails - 一个很好的 gem 排名算法

javascript - Highcharts-React 获取图表的 Base64 PNG

javascript - 使用递归读取对象的属性和属性?

ruby-on-rails - Omniauth Cucumber 测试 - 路由错误

javascript - 如何在单击时从 highchart 事件中的 html 元素触发 jquery 函数 onchange?

HighCharts 多个 Y 轴