Мои модели выглядят так:
class Movie < ActiveRecord::Base
attr_accessible :title, :year, :rotten_id, :audience_score,
:critics_score, :runtime, :synopsis, :link, :image
has_many :jobs, :dependent => :destroy
has_many :actors, :through => :jobs
end
class Actor < ActiveRecord::Base
attr_accessible :name
has_many :movies, :through => :jobs
has_many :jobs, :dependent => :destroy
end
class Job < ActiveRecord::Base
attr_accessible :movie_id, :actor_id
belongs_to :movie
belongs_to :actor
end
Когда я показываю свой индекс актеров, я хотел бы показать количество фильмов , в которых каждый актер снялся.Я могу сделать это с @actor.movies.count
, однако это генерирует запрос SQL для each actor
.С, скажем, 30 актерами, это приведет к 30 дополнительным запросам в дополнение к начальному.
Есть ли способ включить количество фильмов, в которых участвовал каждый актер, в начальный вызов Actor.all
?И тем самым добиться цели всего за один звонок.Дополнительный бонус, если это было отсортировано по указанному количеству.
Обновление: Все предоставленные ответы были полезными, и хотя в какой-то момент это превратилось в какой-то грязный бой, все получилось,Я сделал мешанину из всех ваших предложений.Я добавил колонку movies_counter в свою модель актера.В моей модели работы я добавил belongs_to :actor, :counter_cache => :movies_counter
.Это прекрасно работает и автоматически обновляется, когда я создаю или уничтожаю фильм, без добавления дополнительного кода.