Ruby on rails 如何在rails中动态实现ActiveRecord类的保存钩子后

Ruby on rails 如何在rails中动态实现ActiveRecord类的保存钩子后,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在创建一个gem,它在ActiveRecord类中创建钩子,就像在更新过滤器之前一样。 为此,我创建了一个模块UpdateFilter,如下所示: module UpdateFilter def before_update_filter(*args) puts self #in class scope self.set_callback(:save, :before, args[0].to_sym) end end 而我正在做的是初始化 ActiveRecord::Ba

我正在创建一个gem,它在ActiveRecord类中创建钩子,就像在更新过滤器之前一样。 为此,我创建了一个模块UpdateFilter,如下所示:

module UpdateFilter
 def before_update_filter(*args)
    puts self #in class scope
    self.set_callback(:save, :before, args[0].to_sym)
 end
end
而我正在做的是初始化

ActiveRecord::Base.extend UpdateFilter
嗯。现在所有这些都很好。但我只想在实例的某些属性发生更改时设置_回调,并且我无法访问before_update_filter方法中的属性,因为它在类范围内

作为总结,我想实现hook-like。我希望它能让我明白我想做什么

before_update_filter :instance_mthod_name, :attr_prams => [:name, :rating]

现在我该如何实现这一点呢?

它可能需要一些编辑,但我认为应该可以:

module UpdateFilter
 def before_update_filter(callback_method, options = {})
    puts self # class scope
    self.set_callback :save, :before do
      puts self # instance scope
      # check if all of the listed attributes have changed
      if options[:attr_params].map{ |attr| attribute_changed?(attr) }.all?
        # call instance method
        send callback_method
      end
    end
 end
end
根据传递给
set的块,回调在当前对象的上下文中执行。所以我们可以访问这个块中的所有实例方法。我们检查列出的所有属性(替换为“any”或其他一些条件)是否已更改,然后才调用所需的回调实例方法