0

なぜこれが起こるのか理解できません:

class Foo < ActiveRecord::Base
  belongs_to :belongable, :polymorphic => true

  def after_save 
    if belongable.kind_of?(User)
      send(:some_method)
    end
  end
end

class Bar < Foo

  def some_method
    #Do something
  end
end

class Group < ActiveRecord::Base
  has_many :belongings, :as => :belongable
end

class User < ActiveRecord::Base
  has_many :belongings, :as => :belongable
end

クラス 'Bar' は、Foo から継承する STI モデルです (Foo には 'type' 属性があります)。グループとユーザーの両方が多くのバーを持つことができます。

以下は期待どおりに機能します (some_method は呼び出されません)。

g = Group.create
g.belongings << Bar.new
g.save

以下は some_method を呼び出します。

Group.first.belongings.first.update_attributes(:attr => :val)

どのように、なぜ?!アソシエーションが既に存在すると、'after_save' コールバックの条件が評価されないのはなぜですか?

4

3 に答える 3

0

「some_method」は「update」とは言えません... :-/

AR オブジェクトは既に update ( http://apidock.com/rails/ActiveRecord/Persistence/update ) というメソッドを定義しており、このメソッドは「update_attributes」を呼び出すと呼び出されます。

于 2013-04-03T19:40:53.447 に答える
0

Group.create.belongings << Bar.newBar をデータベースに保存することはありません。したがってafter_save、呼び出されることはありません。2 番目の例update_attributesでは、データベースに保存する which を使用しています。それがトリガーする理由after_saveです。

于 2013-03-31T17:35:06.423 に答える