web-dev-qa-db-fra.com

étendues avec lambda et arguments dans le style Rails 4?

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 -> {}.

140
kaplan

Je pense que cela devrait être:

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

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.

10
Branden Silva

Rails 4, vous pouvez faire:

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

C'était dans le vieux Ruby:

:id => id

Meilleur hachage:

id: id
7
sesperanto

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

Pour soutenir les associations:

scope :find_lazy, -> (object) { where(object_id: object.id) }
2
tokhi
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.

0
mmsilviu