Предварительная загрузка числа нескольких named_scope в Rails - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть следующие классы

class Service < ActiveRecord::Base
    has_many :incidents
end

class Incident < ActiveRecord::Base
    belongs_to :service

    named_scope :active, lambda ...
    named_scope :inactive, lambda ...
end

Я пытаюсь предварительно загрузить счетчики каждого класса инцидентов, чтобы мой взгляд мог сделать что-то вроде:

<% Service.all.each do |s| %>
    <%= s.active.count =>
    <%= s.inactive.count =>
<% end %>

Без выполненияSQL-запрос для каждого счета.Я пробую подход с выбором, но мне не очень везет.Вот что у меня есть:

# In Service class
def self.fetch_incident_counts
  select('services.*, count(incidents.id) as acknowledged_incident_count').
    joins('left outer join incidents on incidents.service_id = services.id').
    where('incidents.service_id = services.id AND ... same conditions as active scope').
    group('services.id')
end

Это будет предварительная выборка одного счета, но я не уверен, как это сделать для двух разных named_scope.

Использование counter_cache не является опцией, потому что база данных записывается с помощью кода не-rails.

Любая помощь приветствуется.

1 Ответ

4 голосов
/ 19 сентября 2011

Я закончил тем, что написал драгоценность для этого. https://github.com/smathieu/preload_counts

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