I have a Post and a Tag model with a many-to-many
association:
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 (model for the join table):
class Tagging < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
I want to create a :counter_cache
that tracks how many posts a tag has.
How can I accomplish that in this many-to-many association?
EDIT:
I did this before:
comment.rb:
belongs_to :post, :counter_cache => true
But now that there isn't a belongs_to
in the post.rb
file. I'm a bit confused.
tagging.rb (model for the join table):
class Tagging < ActiveRecord::Base
belongs_to :post, counter_cache: :tags_count
belongs_to :tag, counter_cache: :posts_count
end
add column migration posts_count integer in tags add column migration tags_count integer in posts
It seems like there is no real easy way to do this. If you look at this previous post. It seems like this comes up fairly often and sadly rails does not have an easy way to complete this task. What you will need to do is write some code like this.
Although, I would also suggest looking into has_and_belongs_to_many relationships as that might be what you have here.
A(Tag) has many C(posts) through B(tagging)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With