哪个更适合在Rails模型验证中使用:Proc或lambda?

时间:2019-03-15 07:47:48

标签: ruby-on-rails ruby validation lambda proc

我知道proc和lambda之间的区别。根据以下准则,在Rails模型验证中使用哪种更好:Proc或lambda?

过程:

  • 行为类似。
  • 可以存储在变量中并且可以四处移动。
  • 参数数量没有问题。
  • return来自proc会退出调用它的方法。

Lambda:

  • 与Proc相同,但更接近方法。
  • 严格要求它获取和需要的参数。
  • return从lambda中退出将退出lambda,并且调用它的方法将继续执行。

但是我还没有看到能使它有所作为的验证:

validates :name, present: true, if: -> { assotiation.present? }
validates :name, present: true, if: proc { |c| c.assotiation.present? }

我检查了rubocop,但没有找到任何建议。您知道在ruby / rails样式指南,rubocop或其他工具中哪个更好?

3 个答案:

答案 0 :(得分:8)

我唯一能想到的区别是使用λs的早期收益的可能性。也就是说,前者会很乐意验证,而后者会提出LocalJumpError

validates :name, present: true,
  if: -> { return false unless assotiation; assotiation.present? }
validates :name, present: true,
  if: proc { return false unless assotiation; assotiation.present? }

此外,我使用以下经验法则:严格胜于完全开放。因此,除非绝对确定您需要proc,否则λ是使用无处不在的更好工具。

答案 1 :(得分:1)

他们从Ruby On Rails Guideline告诉您使用Procs

https://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless

  

最后,可以将:if和:除非与将被调用的Proc对象相关联。使用Proc对象可让您编写内联条件而不是单独的方法。此选项最适合单线。

他们没有明确告诉您原因,而是根据本文:

https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/#Lambdas_vs_Procs

还有Alekesi的回答,我倾向于相信Lambda在这种情况下会更好,因为它的行为非常类似于ruby方法。

老实说,两个选项都很好。

答案 2 :(得分:0)

与实际项目无关紧要:)

例如,在我的项目中,我这样做:

validates :source, presence: true, if: :validated_source_field?

(使用方法)