2017-01-15 8 views
0

решаемыеГрупповые записи в Rails для диаграммы?

У меня есть круговая диаграмма:

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

Данные строится нормально, но я ищу, чтобы сгруппировать «трудность» по этому вопросу. Итак, другими словами, на графике должны быть только математика и искусство. Это диаграмма высоких диаграмм.

Я также попытался следующий другой подход через мою модель, но она не работает:

homework.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 

Хотя не идеально, и я бы предпочел, чтобы сделать это правильно мой подход теперь в лучших работах, но я просто интересно, как группировать результаты по этому вопросу? И если мне нужно пройти через эту модель для каких-либо предложений?

Спасибо!

решаемые

Благодаря Руби Racer:

В контроллере:

@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 

В графике на виду:

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

ответ

1

Не вдаваясь в модели, я бы для чего-то вроде этого:

@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 safe

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

Но вам это действительно не нужно. Таким образом, вы посылаете массив рубин в JS:

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

Или еще лучше:

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

Привет, спасибо, я обновил OP с вашим решением и ошибки я получаю ... есть значения nil в столбце трудности ... – Co2

+0

Просто добавьте 'to_i', см. Мой обновленный ответ. Ниль к i равен нулю –

+0

Спасибо, почти там! data: newdata не работает так изменено на данные: <% = @ newdata.to_json.html_safe%>, и это возвращает данные: [["\" Maths \ "", "26"], ["\" Art \ "" , «30»]], правильный формат должен быть как [«Maths», 26] ... – Co2