在条件回调块(lambda或Proc)中跳过实例

jan*_*szm 3 ruby activerecord ruby-on-rails-3

我注意到几乎所有的人都使用Proc.new而不是lambda(我想是因为它关心/不关心arity),并且通常将当前实例作为参数传递。但是,我检查了一下,即使没有| instance |,它也可以正常工作 作为arg通过。参见下面的例子

class SomeModel < ActiveRecord::Base
  has_many :associated_objects

  before_save :do_something, if: -> { associated_objects.empty? }
end
Run Code Online (Sandbox Code Playgroud)

根据官方指南和互联网上的大多数帖子,看来我应该写

before_save :do_something, if: Proc.new { |instance| instance.associated_objects.empty? }
Run Code Online (Sandbox Code Playgroud)

我的使用->和无参数的示例有问题吗?这类似于跳过自身作为self.some_method内部模型代码中的接收者并使用隐式接收者。

Ant*_*ony 5

正确无误,在Proc或lambda中评估的范围自动设置为您要保存的对象的当前实例。

rails文档中,您可以看到是否要定义自己的回调,可以选择对范围内的对象使用Proc或lambda。

如果给定了proc,lambda或block,则在当前对象的上下文中评估其主体。它还可以选择接受当前对象作为参数。

我发现有趣的是,Rails指南建议将当前实例传递到Proc中(如您所概述的),这是很常见的地方,可以在self暗示时将该信息保留在其他地方。