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