it-swarm.com.de

Gültigkeitsbereiche mit Lambda und Argumenten im Stil von Rails 4?

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 ein Argument gleichermaßen übergeben kann Weg mit 4 wie ich mit 3.

Ich bin ziemlich neu in Rails 3 und versuche, ein paar Beispiele durchzuarbeiten, in denen Rails 4 ausgeführt wird.

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)

Also, wenn dies die Rails 4-Methode ist, -> {} zu verwenden, ist das ein Lambda, richtig? scope :all_lazy, -> { select("*") } Was, wenn ich ein Argument brauchte. Ich habe ein paar ausprobiert verschiedene Ideen und Argumentfehler in der Konsole erhalten, wenn Sie die -> {}.

140
kaplan

Ich denke es sollte sein:

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

Ruby hat den alten Lambda-Stil auch nicht missbilligt. Wenn Sie sich also sicherer fühlen, sollten Sie ihn verwenden.

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.

10
Branden Silva

Rails 4 können Sie:

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

Das war im alten Rubin:

:id => id

Besserer Hash:

id: id
7
sesperanto

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)
  }
3
Astm

Vereine unterstützen:

scope :find_lazy, -> (object) { where(object_id: object.id) }
2
tokhi
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 die Richtlinien befolgen möchten, sollten Sie die Klassenmethode verwenden, wenn Argumente beteiligt sind.

0
mmsilviu