2011-12-29 78 views
2

我有一堆目前扩展ActiveRecord :: Base的模型。如何扩展“保存!”方法在ActiveRecord?

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

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

什么是以OOP方式做到这一点的理想方法?

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

是否有一个更优雅的方式使用模块实现相同的事情?

+0

我会尽量按照您的描述。 – 2011-12-29 10:08:15

+0

我应该更清楚 - OOP结构应该是什么样子? – deruse 2011-12-29 10:18:34

+0

你是什么意思? – 2011-12-29 10:20:47

回答

1

如果你标记一个类为抽象:

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

那么你可以从它继承和Rails不会去寻找一个FOOS表。

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

即使您要通过覆盖保存方法来做到这一点,将覆盖保存方法放在模块中并将该模块包含在需要它的类中也可能更有意义。

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

class MyClass < AR::Base 
    include MySave 
end