Кэш счетчика для модели с ассоциацией «многие ко многим» - PullRequest
4 голосов
/ 07 марта 2012

У меня есть сообщение и тег модель с 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

Но теперь, когда вpost.rb файл.Я немного запутался.

Ответы [ 2 ]

7 голосов
/ 22 июля 2014

tagging.rb (модель для таблицы соединений):

class Tagging < ActiveRecord::Base
  belongs_to :post,  counter_cache: :tags_count
  belongs_to :tag,  counter_cache: :posts_count
end

добавить миграцию столбцов posts_count integer в тегах добавить миграцию столбцов tags_count integer в сообщениях

1 голос
/ 07 марта 2012

Кажется, что нет простого способа сделать это. Если вы посмотрите на этот предыдущий пост. Кажется, что это происходит довольно часто, и, к сожалению, у 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...