scopes with lambda and arguments in Rails 4 style?

100,297

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) }
Share:
100,297

Related videos on Youtube

kaplan
Author by

kaplan

Updated on July 08, 2022

Comments

  • kaplan
    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
    Dennis about 10 years
    Supporting documentation, section 14.1 specifically.
  • hurikhan77
    hurikhan77 almost 10 years
    I 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
    Epigene about 9 years
    Yay, 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
    stevenspiel almost 9 years
    I 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
    furman87 over 8 years
    Note 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
    swordray over 6 years
    "Modern" syntex in Ruby scope :find_lazy, -> id { where id: id }
  • Chloe
    Chloe almost 6 years
    @hurikhan77 Yeah it's disconcerting that the syntax conflicts with CoffeeScript coffeescript.org/#functions