Хотя подобные вопросы уже задавали:
- counter_cache с has_many: через
- зависимый = ›уничтожить has_many через ассоциацию
- has_many: через counter_cache
ни один из них на самом деле не решает мою проблему.
У меня есть три модели с has_many: через ассоциацию:
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
Модель администрирования присоединения имеет следующие атрибуты:
id
user_id
calendar_id
role
Я хотел бы посчитать, сколько calendars
у каждого user
и сколько users
у каждого calendar
.
Я собирался использовать counter_cache следующим образом:
class Administration < ActiveRecord::Base
belongs_to :user, counter_cache: :count_of_calendars
belongs_to :calendar, counter_cache: :count_of_users
end
(и, конечно же, соответствующие миграции для добавления :count_of_calendars
в таблицу users
и :count_of_users
в таблицу calendars
.)
Но затем я наткнулся на это предупреждение в Rails Guides:
4.1.2.4: зависимый
Если вы установите для параметра: зависимые значения:
- : destroy, когда объект уничтожен, destroy будет вызываться для связанных с ним объектов.
- : delete, при уничтожении объекта все связанные с ним объекты будут удалены непосредственно из базы данных без вызова их метода уничтожения.
Не следует указывать эту опцию для ассоциации own_to, которая связана с ассоциацией has_many в другом классе. Это может привести к тому, что записи в вашей базе данных станут потерянными.
Следовательно, что было бы хорошей практикой, чтобы подсчитать, сколько calendars
у каждого user
и сколько users
у каждого calendar
?