I am new to Ruby (and probably more Rails for this) and am trying to
figure out how to do this calculation efficiently.

What I have is a Training table
In the training table, I have a HABTM relationship with trainers

What I am trying to do is get the percentage of each training a trainer
participated in. Taking into account that there may be multiple trainers
per training, so each trainers participation may only be a percentage of
the total training.

I have it working with the code below but this code is FAR from
efficient as it does MANY queries to get the number.

In the chart I am doing this

series: [{
  name: '# Trainings',
  colorByPoint: true,
  data: [
    <% User.trainers.each do |trainer| %>
      {
        name:'<%= trainer.full_name %>',
        y: <%= trainer_percent_of_total(trainer.id) %>,
        drilldown: '<%= trainer.full_name%>'
      },
    <% end %>
      ]
  }],
  drilldown: {
    series: [
      <% User.trainers.each do |trainer| %>
        {
          name: 'Initiative Count',
          id:'<%= trainer.full_name %>',
          data: [
            <% Initiative.all.each do |initiative| %>
            {
              name:'<%= initiative.name %>',
              y: <%=
initiative_percent_of_total_for_trainer(initiative.id, trainer.id) %>
            },
            <% end %>
          ]
        },
    <% end %>
    ]
}


and two helpers

def trainer_percent_of_total(trainer_id)
    all_trainings_count = Training.count
    percentage_of_trainer = 0.00
    users_count = 0

    Training.each do |training|
      if training.users.exists?(trainer_id)
        users_count = training.users.count
        if users_count > 1 then
          percentage_of_trainer += (1.00/users_count).to_f
        else
          percentage_of_trainer += 1.00
        end
      end
    end

    trainer_percentage = 0.00
    if percentage_of_trainer > 0
      trainer_percentage = (percentage_of_trainer.to_f /
all_trainings_count.to_f) * 100
      return trainer_percentage.to_f
    else
      return 0
    end
end

def initiative_percent_of_total_for_trainer(initiative_id, trainer_id)
    all_trainings_count = Training.joins(:users).where("user_id =
?",trainer_id).count
    by_initiative_count=Training.joins(:users).where("initiative_id = ?
AND user_id = ?",initiative_id, trainer_id).count
    initiative_percentage = 0.00
    if by_initiative_count > 0
      initiative_percentage = (by_initiative_count.to_f /
all_trainings_count.to_f) * 100
      return initiative_percentage.to_f
    else
      return 0
    end
end

-- 
Posted via http://www.ruby-forum.com/.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/e98fef9fd4fad6f29006410908c3b1e3%40ruby-forum.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to