什么回调用于创建和销毁?

时间:2012-07-03 20:57:26

标签: mysql ruby-on-rails ruby ruby-on-rails-3 activerecord

我从其他帖子中发现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

2 个答案:

答案 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将不会运行回调,直到成功完成数据库更改(创建或删除)之后。