counter_cache с условиями - PullRequest
       29

counter_cache с условиями

9 голосов
/ 18 сентября 2011

Я знаю, что могу использовать обратные вызовы, но это должно быть осуществимо.Я сделал долгий поиск и безрезультатно.Это то, что, я думал, сработало бы.

def User < ActiveRecord::Base
  has_many :documents
  has_many :draft_docs     , :class_name => 'Document', :conditions => { :status => 'draft' }
  has_many :published_docs , :class_name => 'Document', :conditions => { :status => 'published' }
  has_many :private_docs   , :class_name => 'Document', :conditions => { :status => 'private' }
end

def Document < ActiveRecord::Base
  belongs_to :user      , :counter_cache => true
  belongs_to :user      , :inverse_of => :draft_docs    , :counter_cache => true
  belongs_to :user      , :inverse_of => :published_docs, :counter_cache => true
  belongs_to :user      , :inverse_of => :private_docs  , :counter_cache => true
end

Работает не так, как планировалось, так как вы можете увидеть его обновление документооборота вместо опубликованного_дока.

Ответы [ 2 ]

2 голосов
/ 22 июля 2012

Это потому, что вы используете одно и то же имя для всех ассоциаций.

belongs_to :user, :counter_cache => true
belongs_to :user_doc, :class_name => "User", 
           :inverse_of => :draft_docs, :counter_cache => :draft_docs_count

Эта функция реализована путем добавления обратного вызова для увеличения счетчика, и в вашем случае целью является document.user, так какВы использовали одно и то же имя для всего.

1 голос
/ 18 сентября 2011

Используйте counter_culture gem.

  • Добавьте три столбца в таблицу users.

    add_column :users, :draft_documents_count, :integer, null: false, default: 0
    add_column :users, :published_documents_count, :integer, null: false, default: 0
    add_column :users, :private_documents_count, :integer, null: false, default: 0
    
  • Украсить Document модель

    class Document
      counter_culture :user, :column_name => Proc.new do |doc|
        if %w(draft published private).include?(doc.status) 
          "{doc.status}_documents_count"
        end
      end    
    end
    
  • Запустите команду в консоли, чтобы заполнить счетчики для текущих строк

    Document.counter_culture_fix_counts
    

Старый ответ

Вы можете указать имя столбца счетчика (кроме true) для опции counter_cache.

class Document < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  belongs_to :user, :inverse_of => :draft_docs, 
                                   :counter_cache => :draft_docs_count
  belongs_to :user, :inverse_of => :published_docs, 
                                   :counter_cache => :published_docs_count
  belongs_to :user, :inverse_of => :private_docs, 
                                   :counter_cache => :private_docs_count
end
...