ActiveRecord如何实现`:if => …`关于验证

我一直在查看ActiveRecord源以了解
:if => proc_or_method_name
如何在ActiveRecord验证上工作,但源中
:if
的唯一实例是在解释如何调用该功能的注释中。 例如,您可以在模型中使用如下行:
validates_presence_of :name, :if => :nameable?
如果
nameable?
方法返回给定模型的真值,则仅检查验证。 这个功能实际定义在哪里,因为我在(Rails2)源中的任何地方都找不到这种行为?     
已邀请:
activesupportlibactive_supportcallbacks.rb
中检查
:if
选项。 调用方法
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
这是我发现的方式(万一有人感兴趣): 从github下载Rails v2.3.8并解压缩它。 在所有.rb文件中使用pp1ѭ进行grepp'ed 在
activerecord/CHANGELOG
中,找到了一条评论: 为所有验证添加了:if选项,可以使用块或方法指针来确定是否应该运行验证。 #1324 [Duane Johnson / jhosteny]。 谷歌的评论。在谷歌缓存中找到它。 发现该评论/添加是在大卫05/21/05 10:57:18进行的 位于第546页的rails github历史上的2005-05-21日期: 了解
:if
的工作原理 发现在v2.3.8中不再存在提交的提交代码。必须找到该代码的最新位置 再次grepp'ed
:if
然后去了感觉“好”的每个文件。来到
activesupport/lib/active_support/callbacks.rb
在文件中搜索了
:if
,它只在一个位置找到,方法是
should_run_callback
。 发表回答 交叉的手指等待赏金。 :d 那很有趣!     
从Rails 3开始,ActiveRecord回调在active_record / callbacks.rb中定义,但由于ActiveRecord模型继承自ActiveModel,因此您还应该查看active_model / callbacks.rb文件。 回调功能本身是一个单独的组件。事实上,过滤器之前/之后的ActionController实际上就是回调。 因此,回调系统是ActiveSupport :: Callbacks中定义的模块。 合并这3个部分,您就可以获得ActiveRecord回调功能。     

要回复问题请先登录注册