Bereiche mit Lambda und Argumenten im Rails 4-Stil?


144

Ich frage mich, wie das Folgende in Rails 4 gemacht wird oder ob ich nur den Rails 3-Ansatz verwende, um ein Lambda zu verwenden, das mit 4 ein Argument genauso übergeben kann wie mit 3.

Ich bin ziemlich neu in Rails 3 und versuche, einige Beispiele mit Rails 4 durchzuarbeiten.

Hier ist mein 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)

Wenn dies also der Rails 4-Weg ist, das -> {} zu verwenden, ist das ein Lambda, oder? scope :all_lazy, -> { select("*") }Was ist, wenn ich ein Argument brauche? Ich habe ein paar verschiedene Ideen ausprobiert und bei der Verwendung von -> {} Argumentationsfehler in der Konsole erhalten.

Antworten:


305

Ich denke es sollte sein:

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

2
Unterstützende Dokumentation , speziell Abschnitt 14.1.
Dennis

3
Yay, half mir zu schreibenscope :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
Beachten Sie, dass bei Verwendung von Ruby 1.9 die kurze Lambda-Syntax kein Leerzeichen zwischen dem Pfeil und einem Parameter ( scope :find_lazy, ->(param)) zulässt . In Ruby 2+ ist der Speicherplatz zulässig. Weitere Infos hier ...
furman87

"Modernes" Syntex in Rubyscope :find_lazy, -> id { where id: id }
Schwert

11

Ruby hat auch den alten Lambda-Stil nicht missbilligt. Wenn Sie sich also wohler fühlen, sollten Sie sich dafür entscheiden.

Ich persönlich mag die Syntax des Stabby Lambda selbst nicht, aber irgendwann werden sie wahrscheinlich zur Norm, sodass es nicht schadet, sich an sie zu gewöhnen.


6
Ich mag die Syntax, aber es fühlt sich einfach falsch an, die Argumente zwischen dem Pfeil und dem Funktionskörper zu platzieren, während es "(id) -> {where ...}" hätte sein sollen, was viel ansprechender wäre (und auch nicht) mit meinen mathematischen Kenntnissen oder meiner Coffeescript-Syntax brechen). Am Ende sagt "->" so etwas wie das Zuordnen von Werten zu einem Ergebnis.
Hurikhan77

Ich bin auf eine Situation gestoßen, in der die Verwendung des alten Stils in Rails 4.2 falsche boolesche Werte aus der Datenbank zurückgab. Es ist möglicherweise nicht offiziell veraltet, aber die Verwendung der aktualisierten Syntax hat das Problem behoben.
Stevenspiel

1
@ hurikhan77 Ja, es ist beunruhigend, dass die Syntax mit CoffeeScript in Konflikt steht. coffeescript.org/#functions
Chloe

8

Schienen 4 können Sie tun:

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

Das war im alten Rubin:

:id => id

Besserer Hash:

id: id

5

Ich habe normalerweise die folgende Programmiersyntax verwendet

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

Als ich meinen Code mit Codacy überprüfte, wurde ich auf diese Syntax aufmerksam

Use the `lambda` method for multiline lambdas.

Ich habe es geändert und es funktioniert gut

  scope :find_lazy, lambda {|id|
    where(id: id)
  }

2

Vereinigungen unterstützen:

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

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

ist gleichbedeutend mit

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

Basierend auf Ruby on Rails Guide :Using a class method is the preferred way to accept arguments for scopes.

Es gibt keinen Grund, Bereiche zusammen mit Lambdas anstelle von Klassenmethoden zu verwenden. Es ist eine Frage der persönlichen Präferenz. Wenn Sie jedoch den Richtlinien folgen möchten, sollten Sie die Klassenmethode verwenden, wenn Argumente beteiligt sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.