zakresy z lambdą i argumentami w stylu Rails 4?

144

Zastanawiam się, jak to jest zrobione w Rails 4 lub czy po prostu używam podejścia Rails 3 do używania lambdy, która może przekazać argument w taki sam sposób, jak w przypadku 4, jak w przypadku 3.

Jestem całkiem nowy w Rails 3 i próbuję przepracować kilka przykładów z Rails 4.

Oto mój kod Rails 3:

class Person < ActiveRecord::Base
  scope :find_lazy, lambda {|id| where(:id => id)}
end

# In console I can call
Person.find_lazy(1)

Więc jeśli to jest sposób Railsów 4 to użycie -> {}, to jest lambda, prawda? scope :all_lazy, -> { select("*") }A jeśli potrzebuję argumentu. Wypróbowałem kilka różnych pomysłów i otrzymałem błędy argumentów w konsoli podczas używania -> {}.

kaplan
źródło

Odpowiedzi:

305

Myślę, że powinno być:

scope :find_lazy, -> (id) { where(id: id) }
lis2
źródło
2
Dokumentacja pomocnicza, w szczególności sekcja 14.1.
Dennis
3
Yay, pomogli mi pisaćscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
Epigene
4
Zauważ, że jeśli używasz Ruby 1.9, krótka składnia lambda nie zezwala na spację między strzałką a parametrem ( scope :find_lazy, ->(param)). W Ruby 2+ spacja jest dozwolona. Więcej informacji tutaj ...
furman87
„Nowoczesny” synteks w Rubimscope :find_lazy, -> id { where id: id }
swordray
11

Ruby również nie porzucił starego stylu lambdy, więc jeśli czujesz się bardziej komfortowo, używając go, zrób to.

Osobiście nie podoba mi się składnia stabby lambda, ale ostatecznie prawdopodobnie staną się one normą, więc przyzwyczajenie się do nich nie zaszkodzi.

Branden Silva
źródło
6
Podoba mi się składnia, ale wydaje mi się, że umieszczanie argumentów między strzałką a treścią funkcji wydaje mi się złe, podczas gdy powinno to być „(id) -> {gdzie ...}”, co byłoby znacznie bardziej atrakcyjne (i nie byłoby zerwać z moją wiedzą matematyczną ani składnią coffeescript). Na końcu „->” mówi coś w rodzaju mapowania wartości do wyniku.
hurikhan77
Spotkałem się z sytuacją, w której użycie starego stylu w Railsach 4.2 zwracało niepoprawne wartości logiczne z bazy danych. Może nie być oficjalnie przestarzała, ale użycie zaktualizowanej składni rozwiązało problem.
stevenspiel
1
@ hurikhan77 Tak, to niepokojące, że składnia jest w konflikcie z CoffeeScript coffeescript.org/#functions
Chloe
8

Rails 4, możesz:

scope :find_lazy, -> (id) { where(id: id) }

To było w starym rubinie:

:id => id

Lepszy haszysz:

id: id
sesperanto
źródło
5

facet Zwykle używałem poniższej składni programowania

scope :find_lazy, -> (id) { where(id: id) }

Ale kiedy przeglądałem mój kod za pomocą Codacy, zauważyłem, że ostrzega mnie o tej składni

Use the `lambda` method for multiline lambdas.

Zmieniłem to na i działa dobrze

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
Astm
źródło
2

Aby wspierać stowarzyszenia:

scope :find_lazy, -> (object) { where(object_id: object.id) }
tokhi
źródło
1
scope :find_lazy, -> (id) { where(id: id) }

jest równoważne z

self.find_lazy(id)
  where(id: id)
end

Na podstawie prowadnicy Ruby on Rails :Using a class method is the preferred way to accept arguments for scopes.

Nie ma powodu, aby używać zakresów razem z lambdami zamiast metod klasowych. To kwestia osobistych preferencji. Ale jeśli chcesz postępować zgodnie z wytycznymi, powinieneś użyć metody class, gdy w grę wchodzą argumenty.

mmsilviu
źródło