And*_*own 9 activerecord conditional ruby-on-rails counter-cache
我知道我可以使用回调,但这应该是可行的.我做了很长时间的搜索而没有结果.这是我认为会有用的.
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
Run Code Online (Sandbox Code Playgroud)
没有按计划工作,因为您可以看到它更新documents_count而不是published_docs_count.
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
Run Code Online (Sandbox Code Playgroud)
使用反文化宝石。
向表中添加三列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
Run Code Online (Sandbox Code Playgroud)装饰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
Run Code Online (Sandbox Code Playgroud)在控制台中运行命令以播种当前行的计数
Document.counter_culture_fix_counts
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |