如何在Rails

时间:2015-09-03 09:58:40

标签: ruby-on-rails ruby activerecord

我有一个模型,每次从中访问数据或保存到数据时都需要触发一个方法。我很难弄清楚如何触发该方法。

以下是我尝试的内容:

class MyModel < ActiveRecord::Base

    after_initialize :hello
    def hello
        binding.pry
    end
end

我的理解是,只要访问此模型,after_initialize就会触发,但显然情况并非如此。如何通过以下呼叫触发此操作:

@instance = MyModel.paginate()

3 个答案:

答案 0 :(得分:0)

以下是所有callbacks

的列表
  after_initialize, after_find, after_touch, before_validation, after_validation,
  before_save, around_save, after_save, before_create, around_create,
  after_create, before_update, around_update, after_update,
  before_destroy, around_destroy, after_destroy, after_commit, after_rollback

您可以使用任何这些回调触发您的方法。参见示例

class MyModel < ActiveRecord::Base

   after_find :hello
   after_save :hello
   # call_back goes here ...

   def hello
      binding.pry
   end
end
实例化新对象后触发

after_initialize,如

MyModel.new() 

答案 1 :(得分:0)

Rails没有提供通常可以在这样的操作中访问的方式,但是对于单个案例,它确实可以执行类似

的操作
class MyModel < ActiveRecord::Base
    #all cases that wanna include
    before_save :hello
    after_save :hello
    after_initialize :hello
    def hello
        binding.pry
    end
end

检查来自documentation

的可用回调

答案 2 :(得分:0)

after_initialize在创建实例后触发,而不是在访问实例时触发。实际上,这是什么意思&#34;它被访问&#34;?

如果您指的是调用任何对象方法或调用持久性方法等,它会产生很大的不同。

根据您的需要,您可能希望使用Proxy对象。您可以将实例封装在获取调用的Proxy中,记录要记录的内容,然后调用该对象。否则,你需要覆盖/猴子补丁类中的所有方法,这绝对不是一个好主意。

@instance = MethodLogger.new(@instance)
@instance.paginate