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 具有“类型”属性)。组和用户都可以有很多条。

以下按预期工作(未调用 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

Group.create.belongings << Bar.new从不将 Bar 保存到数据库中。所以after_save永远不会被调用。第二个示例使用update_attributeswhich 确实保存到数据库。这就是它触发的原因after_save

于 2013-03-31T17:35:06.423 回答
0

这是 STI 和多态性的混合。你的 Foo 模型应该有belongable_type 和belongable_id 属性。

我不能完全将其击落,但是将您的比较更改为这个应该可以:

belongable_type == "User"
于 2013-03-31T18:22:40.513 回答
0

“some_method”不能称为“更新”... :-/

AR 对象已经定义了一个名为 update ( http://apidock.com/rails/ActiveRecord/Persistence/update ) 的方法,并且当您调用“update_attributes”时会调用此方法。

于 2013-04-03T19:40:53.447 回答