Est-il possible d'avoir une portée avec des arguments facultatifs?
Est-il possible d'écrire une portée avec des arguments optionnels, de sorte que je peux appeler le champ d'application avec et sans arguments?
Quelque chose comme:
scope :with_optional_args, lambda { |arg|
where("table.name = ?", arg)
}
Model.with_optional_args('foo')
Model.with_optional_args
Je peux vérifier dans le lambda bloc si un argument est donné (comme décrit par Unixmonkey), mais sur l'appel de la portée sans argument, j'ai eu une ArgumentError: wrong number of arguments (0 for 1)
OriginalL'auteur tonymarschall | 2012-04-26
Vous devez vous connecter pour publier un commentaire.
Oui. Il suffit d'utiliser un
*
comme vous le feriez dans une méthode.OriginalL'auteur z5h
Ruby 1.9 étendue des blocs d'avoir les mêmes caractéristiques que les méthodes (les valeurs par défaut sont parmi eux):
Appel:
OriginalL'auteur jdoe
J'ai utilisé
scope :name, ->(arg1, arg2 = value) { ... }
il y a quelques semaines, il a travaillé bon, si la mémoire est correcte. À utiliser avec ruby 1.9+OriginalL'auteur ksol
Vous pouvez modifier conditionnellement à votre portée basée sur un argument donné.
Utilisation:
Ou, vous pouvez fournir une valeur par défaut.
Utilisation:
REMARQUE: La syntaxe indiquée pour
RANDOM()
est spécifique à Postgres. La syntaxe est montré Rails 4.OriginalL'auteur scarver2
Voulais juste vous faire savoir que, selon la guide, la méthode recommandée pour le passage d'arguments aux étendues est d'utiliser une méthode de classe, comme ceci:
Ce qui peut donner un plus propre approche.
OriginalL'auteur Lasse Bunk
Certainement.
J'ai eu une erreur si je ne passe pas un argument: ArgumentError: mauvais nombre d'arguments (0 1)
Vous pouvez utiliser Proc.de nouveau au lieu de lambda pour éviter l'argument de l'erreur. Voir cette vieille discussion sur ce ici
OriginalL'auteur Unixmonkey
Utiliser l' *
OriginalL'auteur edymerchk