Rails выводит количество записей с X в поле? - PullRequest
0 голосов
/ 18 августа 2010

У меня есть несколько записей в модели, называемых Kases, каждая запись kase имеет статус, который может быть Активным, В ожидании, Отправлен счет или Архивирован.

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

В настоящее время я устанавливаю статус записи kase следующим образом:

<li>Case Status<span><%= f.select "kase_status", ['Active', 'On Hold', 'Archived', 'Invoice Sent'] %></span></li>

kase_status - это поле в таблице kases и строка:

  t.string :kase_status

Есть липростой способ сделать это?

Спасибо,

Дэнни

РЕДАКТИРОВАТЬ:

Сообщение об ошибке консоли:

>> Kases.find(:all).select { |k| k.kase_status == "Active"}.size
NameError: uninitialized constant Kases
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:443:in `load_missing_constant'
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:80:in `const_missing'
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:92:in `const_missing'
    from (irb):1
>> 

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Вы можете использовать метод подсчета на Kase, например:

Kase.count(:conditions => ['kase_status = ?', 'Active'])

Это означает, что вы просто делаете запрос, чтобы посчитать количество подходящих объектов, а не извлекать каждый экземпляр Kaseбазы данных и проверки значения.

Если вы хотите получить все различные значения статуса в одном запросе, вы можете сделать:

@all_counts = Kase.find(:all, :group => 'kase_status', :select => 'kase_status, count(*) as how_many)

, который вернет вам коллекцию Kase-как объекты с атрибутами kase_status и how_many.Затем вы можете использовать эту коллекцию для отображения всех ваших статусов.Например,

<% @all_counts.each do |c| %>
    <%= c.kase_status %> : <%= c.how_many %>
<% end %>
3 голосов
/ 18 августа 2010

Да!

Обновление

Следуя советам всех, я обновил ответ. Это гораздо более быстрый и подходящий способ сделать это.

Контроллер

@kases_active_count = Kase.count(:conditions => ['kase_status = ?', 'Active'])
@kases_on_hold_count = Kase.count(:conditions => ['kase_status = ?', 'On Hold'])
@kases_archived_count = Kase.count(:conditions => ['kase_status = ?', 'Archived'])
@kases_invoice_sent_count = Kase.count(:conditions => ['kase_status = ?', 'Invoice Sent'])

HTML

<%= @kases_active_count %>
...