我一直在查看ActiveRecord源代码以了解:if => proc_or_method_name
如何处理ActiveRecord验证,但源中:if
的唯一实例是在解释如何调用该功能的注释中
例如,您可以在模型中使用如下所示的行:
validates_presence_of :name, :if => :nameable?
如果nameable?
方法返回给定模型的真值,则仅检查验证。
这个功能实际定义在哪里,因为我在(Rails2)源中的任何地方都找不到这种行为?
答案 0 :(得分:3)
从Rails 3开始,ActiveRecord回调在active_record/callbacks.rb中定义,但由于ActiveRecord模型继承自ActiveModel,因此您还应该查看active_model/callbacks.rb文件。
回调功能本身是一个单独的组件。事实上,过滤器之前/之后的ActionController实际上就是回调。 因此,回调系统是ActiveSupport::Callbacks中定义的模块。
将这3个部分合并在一起,就可以获得ActiveRecord回调功能。
答案 1 :(得分:3)
在:if
文件中检查activesupport\lib\active_support\callbacks.rb
选项。
调用方法should_run_callback
以检查是否应该执行回调。
还要看一下如何处理回调链,从同一文件中的run_callbacks
方法开始。
该文件的v2.3.8中的一些代码是:
def should_run_callback?(*args)
[options[:if]].flatten.compact.all? { |a| evaluate_method(a, *args) } &&
![options[:unless]].flatten.compact.any? { |a| evaluate_method(a, *args) }
end
以下是我发现的方式(万一有人感兴趣):
:if
in all .rb files activerecord/CHANGELOG
中,找到了一条评论:
:if
如何运作:if
然后浏览每个感觉“好”的文件。来到activesupport/lib/active_support/callbacks.rb
:if
,并且只在方法should_run_callback
中的一个位置找到了它。这很有趣!