Ruby on rails 如何在rails中动态实现ActiveRecord类的保存钩子后
我正在创建一个gem,它在ActiveRecord类中创建钩子,就像在更新过滤器之前一样。 为此,我创建了一个模块UpdateFilter,如下所示: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
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”或其他一些条件)是否已更改,然后才调用所需的回调实例方法