9

我知道我可以使用回调,但这应该是可行的。我做了长时间的搜索,没有结果。这是我认为会奏效的。

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

未按计划工作,因为您可以看到其更新的文档计数而不是发布的文档计数。

ruby-1.9.2-p180 :021 > User.reset_counters 2, :published_docs  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
   (0.7ms)  SELECT COUNT(*) FROM `documents` WHERE `documents`.`user_id` = 2 AND `documents`.`status` = 'published'
   (2.2ms)  UPDATE `users` SET `documents_count` = 233 WHERE `users`.`id` = 2
 => true
4

2 回答 2

2

这是因为您对所有关联使用相同的名称。

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

此功能是通过添加回调来增加计数来实现的,在您的情况下,目标是document.user因为您对所有内容都使用了相同的名称。

于 2012-07-22T01:32:06.853 回答
1

使用counter_culture宝石。

  • 将三列添加到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
    

旧答案

您可以向选项提供计数器列名称(除了truecounter_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
于 2011-09-18T04:30:06.457 回答