Differences between Named Scopes,Lamdas and Procs-Collection of common programming errors
1. Proc doesn’t check the parameters passed, but lambda does
proc1 = Proc.new { |a, b| a + 5 }
proc1.call(2) # call with only one parameter
=> 7 # no error, unless the block uses the 2nd parameter
lambda1 = lambda { |a, b| a + 5 }
lambda1.call(2)
=> ArgumentError: wrong number of arguments (1 for 2)
Proc will throw error only if the block uses the second param.
proc2 = Proc.new { |a, b| a + b }
proc2.call(2) # call with only one parameter
=> TypeError: nil can't be coerced into Fixnum
2. Proc returns from the calling method, while lambda doesn’t
def meth1
Proc.new { return 'return from proc' }.call
return 'return from method'
end
puts meth1
=> return from proc
def meth2
lambda { return 'return from lambda' }.call
return 'return from method'
end
puts meth2
=> return from method
If they are not called inside a method,
proc1 = Proc.new { return "Thank you" }
proc1.call
=> LocalJumpError: unexpected return
lambda1 = lambda { return "Thank you" }
lambda1.call
=> "Thank you"
3. Scopes/Named scopes are a feature of Rails
It is used to specify commonly used queries which can be referenced as method calls on the association objects or models
eg, in user.rb:
scope :developers, -> { where(:role => 'developer') }
You can use it as
@developers = User.developers
Scopes are chainable, so you can do queries like
@developers = User.developers.where(:age => 40)
The scope defined in the example, is exactly same as defining a class method, like below.
def self.developers
where(:role => 'developer')
end