我有一个论坛模型,有很多讨论。每个讨论都有很多帖子。讨论或多或少只是一个帖子对象的集合。
现在我想在论坛中提供一个counter_cache,用于论坛讨论中包含的帖子。
实际上,似乎我应该使用:through
关联而不是两个单独的关联来实现此目的。
但是我找不到任何建议混合has_many:through和has_one:通过关联,只是一对一和多对多,而不是一对多。
class Forum < ActiveRecord::Base
has_many :discussions
has_many :posts, :through => :discussions
end
class Post < ActiveRecord::Base
belongs_to :discussion
has_one :forum, :through => discussion
end
class Discussion < ActiveRecord::Base
has_many :posts
belongs_to :forum
end
类似于上面的建议,还是我应该手动处理计数器缓存?
答案 0 :(得分:2)
这样的事情应该有效。
class Forum < ActiveRecord::Base
has_many :discussions
has_many :posts, :through => :discussions
end
class Post < ActiveRecord::Base
belongs_to :discussion, counter_cache: true
has_one :forum, :through => discussion
after_create :increment_forum_counter_cache
private
def increment_forum_counter_cache
Forum.increment_counter( 'discussions_count', self.discussion.forum.id )
end
end
class Discussion < ActiveRecord::Base
has_many :posts
belongs_to :forum
end
我似乎记得以前通过has_one关系设置counter_cache时遇到问题。上面的方法应该有效。
答案 1 :(得分:0)
因此正常的计数器缓存似乎正常工作,混合关系类型
也是如此class Post < ActiveRecord::Base
belongs_to :user
belongs_to :discussion
has_one :forum, :through => :discussion,
:counter_cache => :posts_counter
end
class Forum < ActiveRecord::Base
has_many :discussions
has_many :posts, :through => :discussions
end
class Discussion < ActiveRecord::Base
has_many :posts
belongs_to :forum
belongs_to :user
end