0

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

资源.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
4

2 回答 2

1

另一种选择是这样做:

after_commit :run_something, on: [:create, :destroy]

这将不同于:

after_create :run_something
after_destroy :run_something

Asafter_commit在成功提交数据库更改(创建或删除)之前不会运行回调。

于 2020-11-23T23:24:58.950 回答
0

创建后和销毁后调用的回调是 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
于 2012-07-03T22:11:09.863 回答