轨.添加"count"列,其中包含来自关联表的值的总和

tar*_*ras 2 ruby database ruby-on-rails

我有Category表和Issue表.

分类模型中:

has_many :issues
Run Code Online (Sandbox Code Playgroud)

问题模型中:

belongs_to :category
Run Code Online (Sandbox Code Playgroud)

我能够编写一个查询,将query_count作为集合的虚拟属性返回:

Category.left_outer_joins(:issues).select('categories.*, COUNT(issues.*) AS issues_count').group('categories.id')
Run Code Online (Sandbox Code Playgroud)

但是,我希望表上的实际列将issues_count存储为表中的值categories,如下所示:

id | name | created_at | updated_at | description | tags | issues_count
Run Code Online (Sandbox Code Playgroud)

Boo*_*age 6

您可以issues_count在"问题"模型中添加一列:

# app/models/issue.rb
class Issue < ApplicationRecord
  belongs_to :category, counter_cache: true
end
Run Code Online (Sandbox Code Playgroud)

这将导致category.issues_countActiveRecord自动更新该字段.

您还必须创建迁移以添加此字段并更新现有记录:

class AddIssuesCountToCategory < ActiveRecord::Migration[5.0]
  def up
    add_column :categories, :issues_count, :integer, default: 0
    Category.reset_column_information
    Category.all.each do |c|
      Category.update_counters c.id, issues_count: c.issues.length
    end
  end
  def down
    remove_column :categories, :issues_count
  end
end
Run Code Online (Sandbox Code Playgroud)

Ryan Bates有一个很好的RailsCasts:http://railscasts.com/episodes/23-counter-cache-column

另请参阅Rails指南:http://edgeguides.rubyonrails.org/association_basics.html#options-for-belongs-to-counter-cache