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

时间:2015-03-03 10:42:06

标签: ruby ruby-on-rails-3 activerecord

我注意到几乎所有人都使用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内部模型代码中使用隐式接收器跳过自己作为接收者。

1 个答案:

答案 0 :(得分:5)

您已经做对了,在Proc或lambda中评估的范围会自动设置为您要保存的对象的当前实例。

rails docs你可以看到,如果你想定义自己的回调,你可以选择在范围内使用Proc或lambda。

  

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

我觉得有趣的是Rails Guides建议将当前实例传入Proc时(正如您所概述的那样)在隐含self时将信息留在其他地方是非常常见的。