我有发布和标记模型,其中包含many-to-many
关联:
post.rb:
class Post < ActiveRecord::Base
attr_accessible :title, :content, :tag_names
has_many :taggings, :dependent => :destroy
has_many :tags, :through => :taggings
attr_writer :tag_names
after_save :assign_tags
def tag_names
@tag_names || tags.map(&:name).join(" ")
end
private
def assign_tags
ntags = []
@tag_names.to_s.split(" ").each do |name|
ntags << Tag.find_or_create_by_name(name)
end
self.tags = ntags
end
end
tag.rb:
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :posts, :through => :taggings
has_many :subscriptions
has_many :subscribed_users, :source => :user, :through => :subscriptions
end
tagging.rb(联接表的模型):
class Tagging < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
我想创建一个跟踪标记有多少帖子的:counter_cache
。
如何在这种多对多关联中实现这一目标?
修改
之前我这样做过:
comment.rb:
belongs_to :post, :counter_cache => true
但现在belongs_to
文件中没有post.rb
。我有点困惑。
答案 0 :(得分:7)
tagging.rb(连接表的模型):
class Tagging < ActiveRecord::Base
belongs_to :post, counter_cache: :tags_count
belongs_to :tag, counter_cache: :posts_count
end
在标记中添加列迁移posts_count整数 在帖子中添加列迁移tags_count整数
答案 1 :(得分:1)
似乎没有真正简单的方法来做到这一点。 If you look at this previous post.看起来这种情况经常发生,而且可悲的是,rails并没有简单的方法来完成这项任务。你需要做的就是写一些像这样的代码。
虽然,我也建议调查has_and_belongs_to_many关系,因为这可能就是你在这里所拥有的。
A(标签)有很多C(帖子)到B(标记)
class C < ActiveRecord::Base
belongs_to :B
after_create :increment_A_counter_cache
after_destroy :decrement_A_counter_cache
private
def increment_A_counter_cache
A.increment_counter( 'c_count', self.B.A.id )
end
def decrement_A_counter_cache
A.decrement_counter( 'c_count', self.B.A.id )
end
end