我从其他帖子中发现cache_counter无法在has_many关联上完成,所以现在我尝试用回调手动完成它。问题是我听说after_save不能用于删除。我希望在创建或销毁某些东西后调用它。我更困惑,因为如果resource_tags被修改,它将无法正确更新资源我不认为:/
总的来说,我想确保我做对了。
标签有很多资源,资源有很多标签。
我需要最终找出每个标签有多少资源(我不关心每个资源有多少标签)
tag.rb(不确定这里受保护)
has_many :resource_tags
has_many :resources, :through => :resource_tags
attr_accessible :name
attr_protected :resource_count
resource.rb
after_save :cache_resource_count_on_tags
def cache_resource_count_on_tags
self.tags.each {|tag| tag.update_attribute(:resource_count, tag.resources.count)}
end
我的迁移:
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name
t.integer :resources_count, :default => 0
t.timestamps
end
end
end
答案 0 :(得分:0)
在create和after之后调用的回调是after_create和after_destroy,如下所示:http://guides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks
因此,为了在某些事件之后运行某些东西,你可以这样做:
after_create :run_something
after_destroy :run_something
def run_something
# ...
end
答案 1 :(得分:0)
另一种选择是这样做:
after_commit :run_something, on: [:create, :destroy]
此操作将不同于:
after_create :run_something
after_destroy :run_something
因为after_commit
将不会运行回调,直到成功完成数据库更改(创建或删除)之后。