如何延长“保存!” ActiveRecord上的方法?

时间:2011-12-29 10:05:34

标签: ruby-on-rails activerecord

我有一堆模型,目前扩展了ActiveRecord :: Base。

对于所有这些模型,我想扩展save!方法并增加一些功能。例如,

def save!
  begin
    super
  rescue 
    # additional exception handling logic
  end
end

以OOP方式实现这一目标的理想方式是什么?

我尝试了继承ActiveRecord(MyActiveRecord)并在子类中使用上面的代码。然后我使用子类作为我所有模型的父类。但是,ActiveRecord尝试找到表myapp_test.my_active_records。

使用可以实现相同目标的模块是否有更优雅的方式?

1 个答案:

答案 0 :(得分:1)

如果您将类标记为抽象:

class Foo < ActiveRecord::Base
  self.abstract_class = true
end

然后你可以从它继承,rails不会去寻找foos表。

在这种特殊情况下,我不会覆盖保存 - 已经有一组回调(around_savearound_update等)可能更有意义。

即使您是通过覆盖save方法来实现的,通过将覆盖的保存方法放在模块中并将该模块包含在需要它的类中来实现它也更有意义。

module MySave
  def save!
    super
  rescue
  ...
  end
end

class MyClass < AR::Base
  include MySave
end