Rails ActiveRecord找到什么返回

时间:2011-09-09 16:03:09

标签: ruby-on-rails ruby activerecord

我正在使用find方法如下:

@records = Effort.find( :all,
                        :select => 'full_name, taskType, sum(hours)',
                        :group => 'full_name, taskType',
                        ...
@records.each do |record|

查询工作正常。我感到困惑的是如何访问总和(小时)值。我尝试了以下内容:

record.sum(hours) # undefined local variable hours
record.sum_hours  # sum_hours undefined
record[2]         # Gives empty string
record[3]         # Same, just double checking where the index might start...

我有点卡住如何访问该值!如果我将<%= debug @records %>添加到我的视图中,我会看到调试输出,例如:

---
- !ruby/object:Effort
  attributes:
    full_name: admin
    taskType: Pre-Sales
    sum(hours): '16'

3 个答案:

答案 0 :(得分:2)

您希望通过此查询实现什么目标?您是否想要获得所有Effort小时的总和,或者通过其他方式对它们进行分组?

以下查询

@records = Effort.find( :all,
                        :select => 'full_name, taskType, sum(hours)',
                        ...

只返回1个值,因为你在那里选择sum(hours),这导致SQL将结果聚合到第一行。这意味着您将始终获得第一个Effort行,并将sum(hours)字段设置为所有工作所花费的总时数。

如果您只想要所有Effort小时的总和,您可以这样做:

Effort.sum(:hours)

如果您希望根据其他一些标准来计算小时数,请更新您的问题。

修改

在这种情况下,你可以这样做,

@records = Effort.group(:full_name, :taskType).sum(:hours)

你最终会得到一个如下所示的哈希:

[full_name, taskType] => count

['baking cookies', 'baking'] => 12
['baking cakes', 'baking'] => 2
...

您可以像:

一样迭代它
@records.each do | (full_name, task_type), hours |
  puts 'Full Name: #{full_name}, Task Type: #{task_type}, Total Hours: #{hours}'
end

答案 1 :(得分:0)

不确定它是否有效,但您可能想尝试一下:

@sums = Effort.sum(:hours, 
                   :group => [:project_task_id, :user_id],
                   :joins => [:project_task, :user])

它应该为您提供一系列记录。那么你通常应该能够收集这些:

@array = @sums.collect do |aggregate|
           [aggregate.project_task.name, aggregate.user.name, aggregate.hours]
         end

答案 2 :(得分:0)

回顾我的帖子和调试输出时,我突然想到它就在页面上:

record.attributes[ 'sum(hours)' ]

我认为像record.full_name这样的东西真的是一种访问属性数组的便捷方法吗?