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)
您可以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
| 归档时间: |
|
| 查看次数: |
3320 次 |
| 最近记录: |