counter_cache has_many_through sql оптимизация, уменьшить количество SQL запросов - PullRequest
5 голосов
/ 15 января 2011

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

Meeting.find (5) .users.size => ВЫБРАТЬ СЧЕТ (*) ОТ ... ГДЕ ...

User.find (123) .meetings.size => SELECT COUNT (*) FROm ... WHERE ...

Я не знаю, как использовать counter_cache здесь.

Вот мое модельное отношение:

class Meeting < ActiveRecord::Base
  has_many :meeting_users
  has_many :users, :through => meeting_users
end

class User < ActiveRecord::Base
  has_many :meeting_users
  has_many :meetings, :through => meeting_users
end

class Meeting_user < ActiveRecord::Base
  belongs_to :meeting
  belongs_to :user
end

Каковы наиболее оптимальные решения?

А как реализовать counter_cache здесь?

Ответы [ 2 ]

22 голосов
/ 17 апреля 2011

Начиная с Rails3.0.5 и в более новых версиях, вы теперь можете установить счетчик кэша для модели "компоновщика", в вашем случае это будет:

class MeetingUser < ActiveRecord::Base
  belongs_to :meeting, :counter_cache => :users_count
  belongs_to :user, :counter_cache => :meetings_count
end

Важно явно указать countимена столбцов, в противном случае используемые столбцы по умолчанию будут meeting_users_count.

1 голос
/ 15 января 2011

Насколько я знаю, вы не можете использовать counter_cache с through ассоциациями, поэтому вы должны вручную увеличивать его.

Например (не проверено):

class MeetingUser < ActiveRecord::Base

  ...

  after_create { |record| 
    Meeting.increment_counter(:users_count, record.meeting.id)
  }

  after_destroy { |record| 
    Meeting.decrement_counter(:users_count, record.meeting.id)
  }

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