Как выполнить поиск по результатам запроса, чтобы не делать много запросов - PullRequest
2 голосов
/ 13 января 2011

У меня есть следующий набор запросов, но я уверен, что это не СУХОЙ.Тем не менее, я не могу выяснить, как отфильтровать через var сделок вместо того, чтобы снова запрашивать каждую переменную.Возможно ли это?

deals = Deal.all
won = Deal.find( :all, :conditions => ["status = 'won'"] ).count
pending = Deal.find( :all, :conditions => ["status = 'pending'"] ).count
lost = Deal.find( :all, :conditions => ["status = 'lost'"] ).count

Ответы [ 5 ]

5 голосов
/ 13 января 2011

Использовать GROUP BY Предложение SQL:

Hash[Deal.all(:select => 'status, count(*) as count', :group => 'status').map{|e| 
  [e.status, e.count]
}]

Редактировать: Я забыл, что у вас уже есть все загруженные записи. В этом случае вы можете получить счет за статус следующим образом:

Hash[deals.group_by(&:status).map{|k,v| [k,v.count]}]
1 голос
/ 13 января 2011

Вы можете использовать Array # select :

deals = Deal.all
won   = deals.select { |deal| deal.status == 'won' }.length
# similar for pending and lost 
1 голос
/ 13 января 2011

Вы можете использовать следующее: -

Deal.find (: all,: select => 'status, count (id) as deal_count',: group => 'status')

0 голосов
/ 13 января 2011

если ваши объекты Deal являются объектами ActiveRecord (что обычно имеет место для моделей), вы можете запустить счетчик в базе данных:

won = Deal.count_by_sql("select count(*) from deals where status = 'won'")

Другой способ сделать этобыло бы написать SQL-запрос, который будет делать все подсчет для вас, и сгруппировать их по статусу:

count_by_status = Deal.find_by_sql("select status,count(*) from deals group by status;")

Затем вы можете использовать результат (который будет массивхешей я думаю).

0 голосов
/ 13 января 2011

Я думаю, вы можете использовать для этого функцию ввода Ruby:

won = deals.inject(0) {|total, deal| deal.status == 'won' ? total + 1 : total }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...