counter_cache实现的问题

NJ.*_*NJ. 43 ruby-on-rails counter-cache

我得到'耙子流产!... posts_count标记为只读'错误.

我有两个模型:用户和帖子.

users has_many posts.

posts belongs_to :user, :counter_cache => true
Run Code Online (Sandbox Code Playgroud)

我有一个迁移,它将posts_count列添加到users表,然后计算并记录每个用户的当前帖子数.

self.up
  add_column :users, :posts_count, :integer, :default => 0

  User.reset_column_information
  User.all.each do |u|
    u.update_attribute( :posts_count, u.posts.count)
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行迁移时,我收到错误.这当然非常明确,如果我从posts模型中删除:counter_cache声明,例如

belongs_to :user
Run Code Online (Sandbox Code Playgroud)

迁移运行正常.显然,这没有意义,因为你无法以这种方式真正实现它.我错过了什么?

Ada*_*sek 97

你应该User.reset_counters这样做.另外,我建议使用find_each而不是each因为它将批量迭代集合而不是一次性.

self.up
  add_column :users, :posts_count, :integer, :default => 0

  User.reset_column_information
  User.find_each do |u|
    User.reset_counters u.id, :posts
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 似乎首选方法是:"User.reset_counters u.id,:posts_count".请参阅http://api.rubyonrails.org/classes/ActiveRecord/CounterCache.html (2认同)