scopes with lambda and arguments in Rails 4 style?
Solution 1
I think it should be:
scope :find_lazy, -> (id) { where(id: id) }
Solution 2
Ruby has not deprecated the old style of lambda either, so if you feel more comfortable using that by all means go for it.
I don't personally like the stabby lambda's syntax myself but eventually they will probably become the norm so it doesn't hurt to get used to them.
Solution 3
Rails 4, you can do:
scope :find_lazy, -> (id) { where(id: id) }
That was in the old ruby:
:id => id
Better hash:
id: id
Solution 4
guy I was usually using the below programming syntax
scope :find_lazy, -> (id) { where(id: id) }
But when I was reviewing my code using Codacy I found it alerting me about this syntax
Use the `lambda` method for multiline lambdas.
I changed it to be and it working well
scope :find_lazy, lambda {|id|
where(id: id)
}
Solution 5
To support associations:
scope :find_lazy, -> (object) { where(object_id: object.id) }
Related videos on Youtube
kaplan
Updated on July 08, 2022Comments
-
kaplan almost 2 years
I'm wondering how the following is done in Rails 4 or if I just use the Rails 3 approach for using a lambda that can pass an argument the same way with 4 as I do with 3.
I'm pretty new to Rails 3 and trying to work through some samples running Rails 4.
Here is my Rails 3 code:
class Person < ActiveRecord::Base scope :find_lazy, lambda {|id| where(:id => id)} end # In console I can call Person.find_lazy(1)
So if this is the Rails 4 way is to use the -> {}, that's a lambda, right?
scope :all_lazy, -> { select("*") }
What if I needed an argument. I tried a few different ideas and get argument errors in the console when using the -> {}. -
Dennis about 10 yearsSupporting documentation, section 14.1 specifically.
-
hurikhan77 almost 10 yearsI like the syntax but it feels plain wrong to place the arguments between the arrow and the function body, while it should've been "(id) -> { where ... }" which would be much more appealing (and would neither break with my maths knowledge nor coffeescript syntax). In the end "->" says something like mapping values to a result.
-
Epigene about 9 yearsYay, helped me write
scope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
-
stevenspiel almost 9 yearsI ran into a situation where using the old style in Rails 4.2 was returning incorrect boolean values from the database. It may not be officially deprecated, but using the updated syntax fixed the issue.
-
furman87 over 8 yearsNote that if you are using Ruby 1.9, the short lambda syntax does not allow a space between the arrow and a parameter (
scope :find_lazy, ->(param)
). In Ruby 2+, the space is allowed. More info here... -
swordray over 6 years"Modern" syntex in Ruby
scope :find_lazy, -> id { where id: id }
-
Chloe almost 6 years@hurikhan77 Yeah it's disconcerting that the syntax conflicts with CoffeeScript coffeescript.org/#functions