Bonjour,
Dans le cadre d'une manipulation pour démonstration sur de la "reprise
d'un code", j'ai eu besoin de créer un scope qui ne fait rien (scope
idempotent). Cela fonctionne mais ne trouvant rien dans la
documentation je me demande si cela est prévu ou risqué et donc votre
avis là dessus. Nous avons de plus discuté d’autres usages de cette
technique (par exemple commencer le code en décrivant les requêtes
avec des scopes avant d’avoir toutes les informations sur la BDD dans
le cas d'une refonte, d'un dev incrémental ou d'un client qui ne peut
tout fournir à l'heure).
Si besoin je joins un exemple de la démonstration, mais la question
n’est pas liée à l’exemple (que je ferais différemment si j’avais à le
faire « en vrai »), seulement à l'utilisation d'un scope "vide"
Exemple :
J'ai un objet Company, dans un contrôleur utilisant
InheritedRessource. La gestion des droits d'accès à l'objet Company
est fait dans cet objet pour des raisons historiques (et si on décide
de refaire cela proprement l’exemple n’a plus de sens…), plus
clairement on a :
class Company < ActiveRecord::Base
scope :accessible_by_user, lambda { |user|
<... construit un scope renvoyant toutes les companies
accessible par cet utilisateur à ce jour>
}
...
end
Le problème c’est que InheritedRessource, lorsqu’on lui spécifie une «
begin_of_association_chain » ajoute de lui même le nom de la
collection après. Par exemple dans ce cas en définissant
def begin_of_association_chain
Company.accessible_by_user(@current_user)
end
InheritedRessource recherchera :
Company.accessible_by_user(@current_user).companies
et companies n’est pas défini pour l’objet ActiveRecord::Relation
renvoyé.
D'ou l'utilisation d'un scope vide :
scope :companies
Ce qui fonctionne.
Note : En temps normal j’aurais simplement résolu le pb ainsi :
class User < ActiveRecord::Base
def companies
Company. accessible_by_user(self)
end
end
def begin_of_association_chain
@current_user
end
Dans le controlleur, mais l'objet user a déjà une relation companies
définie sur l'objet Company qui ne correspond pas à ses droits d'accès
à cet objet. Et... La question est sur le scope vide !
Merci.
Raphaël.
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse
[email protected]