虽然已经有类似的问题被提出:
- 如何使用 has_many :through 和 counter_cache
- 在“has_many through”关联中使用 dependent => destroy
- 如何在 has_many :through 关联中使用 counter_cache
但是它们都没有解决我的问题。
我有三个模型,使用 has_many :through 关联:
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
我希望能够计算每个用户拥有多少个日历,以及每个日历被多少用户所拥有。我原本想使用如下的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指南中发现了这个警告:
引用: 4.1.2.4:dependent 如果您将:dependent选项设置为: :destroy,当对象被销毁时,将调用其关联对象上的destroy。 :delete,在销毁对象时,所有关联对象将直接从数据库中删除,而不调用它们的destroy方法。 您不应该在belongs_to关联上指定此选项,该关联与其他类上的has_many关联相连接。这样做可能导致数据库中的孤立记录。 因此,计算每个用户拥有多少个
calendars
和每个calendar
拥有多少个users
的良好实践是什么?
:question_id
是指什么? - Thibaud Clementdependant: :destroy
吗? - Thibaud Clementdependant: :destroy
执行相同的功能,它在销毁时销毁关联记录。而在这里,您正在手动执行此操作,但保留了 counter_cache。 - RazaAdministration.delete_all(calendar_id: self.id)
替换User.delete_all(:calendar_id => self.id)
。 - dadachi