2013-06-27 3 views
1

Я пытаюсь создать статистику для определенного диапазона дат. Например, у меня есть модель проекта с атрибутом «продолжительность». Пользователь может выбрать из меню трех различных значений:Rails 3: получить общее количество определенных значений

  • учебный год
  • Семестр
  • термин Летний

Это то, что я до сих пор в поисках контроллера:

def index 
    unless params[:from].nil? and params[:to].nil? 
    @result = Project.where('start_date >= ? AND start_date <= ?', Date.strptime(params[:from], "%m/%d/%Y"), Date.strptime(params[:to], "%m/%d/%Y")) 
... 
end 

Что дает мне массив всех проектов, но я не могу преобразовать этот массив в статистику.

Я хочу получить в общей сложности проекты, имеющие продолжительность учебного года, общее количество которых имеет продолжительность семестра и общее количество, которое имеет продолжительность летнего семестра.

Код должен быть достаточно гибким, и если позже я добавлю «Один месяц» в список опций, код подберет его.

я уже сделал это с суммами, но не со строковыми значениями: Rails 3. Get totals from array

Результат будет выглядеть что-то похожее на это:

** Duration ** 
Academic year: 12 
Semester: 9 
Summer term: 5 

** Course Disciplines ** 
Dental: 11 
Biomedical: 3 
Nursing: 7 

** many more other attributes *** 

Спасибо!

+1

Это больше похоже на запрос, чем вопрос. Что вы пробовали? – NicoSantangelo

+0

обновленный вопрос – leonel

+0

@ result.count даст вам количество проектов. Обновите свой Ruby. – HM1

ответ

0

Не было бы просто найти все проекты, где продолжительность = «Семестр», а затем сделать счет на возвращаемом массиве?

+0

да, но мне нужно получить количество МНОГИХ атрибутов: дисциплина курса, часы работы, междисциплинарные проекты и т. Д. – leonel

+1

Так что напишите модельный запрос на все, что вам нужно. Если у вас есть конкретный вопрос, когда что-то не работает должным образом, мы можем ответить, но мы не можем предсказать, что вы хотите, и написать код для вас. Обратитесь к направляющим направляющих по запросам - http://guides.rubyonrails.org/v3.2.13/active_record_querying.html – HM1

0

Предположим, что каждый экземпляр @result возвращает строку (или еще лучше символ), когда #duration называется, это поможет вам начать:

# Sample data for example, use an OpenStruct to simulate the model 
require 'ostruct' 
@result = (["Academic year"] * 12 + ["Semester"] * 9 + ["Summer Term"] * 5).map { |a| OpenStruct.new(duration: a) } 

durations = @result.to_a.inject(Hash.new(0)) { |a, p| a[p.duration] += 1; a } 
# => {"Academic year"=>12, "Semester"=>9, "Summer Term"=>5} 
0

Рубин имеет большой выбора метода на классе Array, так вы можете сделать что-то вроде этого:

a = [1, 3, 10, 20, 50] 

results = a.select {|item| item > 3} 

puts results 

#->[10, 20, 50] 

с помощью этого вы могли бы настроить некоторые сложные требования, а затем просто запустить счетчик на результирующий массив.

Стоит отметить, что если вам нужно делать это для многих предметов, часто, вероятно, стоит хранить статистику в другой таблице или системе, которая обновляется в фоновом режиме (например, с помощью resque) или при создании/обновлении.

0

добавить

attr_accessor :total 

To Project модель и изменить свой запрос следующим образом:

@result = Project.select("duration, count(*) as total").group("duration").where('start_date >= ? AND start_date <= ?', Date.strptime(params[:from], "%m/%d/%Y"), Date.strptime(params[:to], "%m/%d/%Y"))