0

他のいくつかの投稿から、has_many アソシエーションでは cache_counter を実行できないことがわかったので、コールバックを使用して手動で実行しようとしています。問題は、削除時に 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

0

ここに示すように、作成後および破棄後に呼び出されるコールバックはafter_createおよび after_destroy です。

したがって、これらのイベントのいくつかの後に何かを実行するには、次のようにします。

after_create :run_something
after_destroy :run_something

def run_something
  # ...
end
于 2012-07-03T22:11:09.863 に答える