Что Rails ActiveRecord находит возвращение - PullRequest
1 голос
/ 09 сентября 2011

Я использую метод поиска следующим образом:

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

2 голосов
/ 09 сентября 2011

Чего именно вы пытаетесь достичь с помощью этого запроса?Вы пытаетесь получить сумму всех 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
0 голосов
/ 09 сентября 2011

Оглядываясь назад на мой пост и результаты отладки, мне вдруг пришло в голову, что это прямо на странице:

record.attributes[ 'sum(hours)' ]

Полагаю, что такие вещи, как record.full_name, действительно удобны длядоступ к массиву атрибутов?

0 голосов
/ 09 сентября 2011

не уверен, что это работает, но вы можете попробовать это:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...