Je me demande comment les opérations suivantes sont effectuées dans Rails 4 ou si j'utilise simplement l'approche Rails 3 pour utiliser un lambda qui peut transmettre un argument de la même manière avec 4 que moi avec 3.
Je suis assez nouveau pour Rails 3 et essayer de travailler sur quelques exemples exécutant Rails 4.
Voici mon 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)
Donc, si c’est le Rails 4, c’est utiliser le -> {}, c’est un lambda, non? scope :all_lazy, -> { select("*") }
Et si j'avais besoin d'un argument? J'ai essayé quelques idées différentes et obtenir des erreurs d'argument dans la console lorsque vous utilisez l'option -> {}.
Je pense que cela devrait être:
scope :find_lazy, -> (id) { where(id: id) }
Ruby n'a pas déprécié l'ancien style de lambda non plus, alors si vous vous sentez plus à l'aise avec ça, foncez.
Personnellement, je n'aime pas moi-même la syntaxe de stabby lambda, mais à la longue, elles deviendront probablement la norme et il ne fera pas de mal de s'y habituer.
Rails 4, vous pouvez faire:
scope :find_lazy, -> (id) { where(id: id) }
C'était dans le vieux Ruby:
:id => id
Meilleur hachage:
id: id
gars j'utilisais habituellement la syntaxe de programmation ci-dessous
scope :find_lazy, -> (id) { where(id: id) }
Mais lorsque je passais en revue mon code avec Codacy, je l’ai alerté sur cette syntaxe.
Use the `lambda` method for multiline lambdas.
Je l'ai changé et ça marche bien
scope :find_lazy, lambda {|id|
where(id: id)
}
Pour soutenir les associations:
scope :find_lazy, -> (object) { where(object_id: object.id) }
scope :find_lazy, -> (id) { where(id: id) }
est équivalent avec
self.find_lazy(id)
where(id: id)
end
Basé sur Ruby sur Rails guide : Using a class method is the preferred way to accept arguments for scopes.
Il n'y a aucune raison d'utiliser les portées avec lambdas de préférence aux méthodes de classe. C'est une question de préférence personnelle. Toutefois, si vous souhaitez suivre les instructions, vous devez utiliser la méthode de classe lorsque des arguments sont impliqués.