为什么这个范围的lambda后跟一个块?

时间:2016-09-03 11:34:08

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

以下是a method described in the Rails API

scope(name, body, &block)    

这是使用Rails API中描述的方法的一个示例:

class Shirt < ActiveRecord::Base
  scope :red, -> { where(color: 'red') } do
    def dom_id
      'red_shirts'
    end
  end
end

问题是关于以下代码:

do
  def dom_id
    'red_shirts'
  end
end

它代表什么?我无法找到任何关于块的Ruby语法可以遵循lambda。我错过了什么?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

在您的示例中,lambda是scope的第二个常规参数,块是scope的块参数(与lambda语法无关)。

The block lets you define what ActiveRecord calls "extensions",可以在关联的返回值上调用的方法。您的示例中定义的方法将像这样调用:

Shirt.red.dom_id

has_many associations can be extended in the same way.这个例子有点奇怪,因为它与视图层有关;扩展程序更常用于查找程序和创建者之类的内容。

答案 1 :(得分:1)

dom_id id作为范围的方法,你可以调用Shirt.red.dom_id但你不能调用Shirt.dom_id。有时您需要仅属于给定范围的方法

答案 2 :(得分:1)

我想我遇到了问题。

def testLambdaParams(name,body)
  puts name
  body.call
  yield "testLambdaParams_yield" if block_given?
end

second_proc = -> do
  puts "second_proc"
  yield 'second_proc' if block_given?
end


testLambdaParams "first_params",second_proc do |x| 
  puts "block exec for testLambdaParams " + x
end

结果:

first_params
second_proc
block exec for testLambdaParams testLambdaParams_yield

最后一个区块用于testLambdaParams 用于 lambda