我有2个对象,User
和Goal
(User has_many :goals
和Goal belongs_to :user
)
在我的Goal
模型中,我有..
def total_goal_xp
total_activities_sum = self.activities.sum(:quantity)
return (total_activities_sum*xp_value)
end
在我的User
show.html.erb
文件中,我正在使用Google图表创建饼图并从我的Goal
模型中提取数据。
<%= pie_chart @goals.group(:name).sum(&:total_goal_xp) %>
出于某种原因,我可以访问goal
表中的部分,例如:name
,但它不会让我从上面包含的Goal
方法返回结果。
这是我的users_controller
文件...
def show
@goals = current_user.goals
@activities = current_user.activities.reverse
end
更新:我现在已将show.html.erb文件中的行更改为...
<%= pie_chart @goals.group(:name).sum(@goals.each.sum { |p| p.xp_value * p.activities.sum(:quantity) }) %>
现在它显示饼图,但不是按每个goal_id的单个总xp分解xp,而是简单地获取所有目标的总xp并将该值分配给每个goal_id。我有6个目标,当我将鼠标悬停在图表上时,每个目标有16.7%的图表和相同的值xp。
第二次更新:我已将饼图移动到名为dashboard.html.erb的文件中的目标视图文件夹中,并在目标控制器中创建了一个名为dashboard的方法。我已经将饼图的代码行改为......
<%= pie_chart @goals.group(:name).sum(@goals.each.sum { |p| p.total_goal_xp }) %>
这仍然给出了与上面一行完全相同的结果。它需要总价值并将其分配给每个目标,因此它们被平分。有谁知道我的总和有什么问题,为什么不计算每个目标的结果而不是所有目标?
第三次更新:我已将仪表板移回用户视图文件夹,并在我的用户控制器中创建了一个名为dashboard的方法。我已将仪表板中的代码行更改为...
<%= pie_chart @goals.group(:name).sum(@goals.sum.each { |p| p.total_goal_xp }) %>
基本上我已经切换了sum
和each
的顺序,但现在它给了我以下SQL错误消息......
SQLite3::SQLException: wrong number of arguments to function SUM(): SELECT SUM() FROM "goals" WHERE "goals"."user_id" = ?
第四次更新:我在总和之前添加了地图功能。这是新的代码行......
<%= pie_chart @goals.group(:name).map(&:total_goal_xp).sum(&:total_goal_xp) %>
这给了我以下错误..
undefined method `total_goal_xp' for 700:Fixnum
700是第一个目标的正确total_goal_xp
值,所以我觉得我很接近,但我不知道还有什么可以尝试。我已经尝试了map()。总和,它仍然给了我no data
。我已经尝试了没有总和,并返回一个空白。
第五次更新:我在.map()之后删除了.sum()并添加了find_by(:goal_id),它现在给了我一个错误的数组,并且每个正确的值都在其中。我怎样才能让它显示出来?
这是完整的错误消息..
undefined method `find_by' for [700, 500, 250, 2000, 500, 0]:Array
Did you mean? find
index_by
find_all
min_by