我注意到几乎所有人都使用Proc.new而不是lambda(我猜是因为它关心arity的关注程度),并且将当前实例作为参数传递也很常见。但是我检查了它也没有| instance |作为一个arg通过。请参阅下面的示例
class SomeModel < ActiveRecord::Base
has_many :associated_objects
before_save :do_something, if: -> { associated_objects.empty? }
end
根据官方指南和互联网上发现的大多数帖子,似乎我应该写
before_save :do_something, if: Proc.new { |instance| instance.associated_objects.empty? }
我的示例使用 - &gt;是否有问题?没有争论?它类似于在self.some_method
内部模型代码中使用隐式接收器跳过自己作为接收者。
答案 0 :(得分:5)
您已经做对了,在Proc或lambda中评估的范围会自动设置为您要保存的对象的当前实例。
从rails docs你可以看到,如果你想定义自己的回调,你可以选择在范围内使用Proc或lambda。
如果给出了proc,lambda或block,则在其中评估其正文 当前对象的上下文。它也可以选择接受 当前对象作为参数。
我觉得有趣的是Rails Guides建议将当前实例传入Proc时(正如您所概述的那样)在隐含self
时将信息留在其他地方是非常常见的。