L'arrière-plan de ce problème est assez complexe et compliqué, et comme je cherche une réponse simple, je vais laisser le problème de côté pour expliquer mon problème, et fournir cette situation hypothétique.ActiveRecord named_scope, .scopes
Si j'ai un modèle simple ActiveRecord appelé Automobile, avec named_scopes comme ci-dessous:
named_scope :classic, :conditions => { :build_date <= 1969 }
named_scope :fast, lambda { |speed| :top_speed >= speed }
Ignorant les champs eux-mêmes, si je devais appeler:
Automobile.scopes
Que serait exactement ce retournerait ? Ce que je vois dans la console est:
[ :classic => #<Proc:[email protected]/Users/user_name/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/named_scope.rb:87>,
:fast => #<Proc:[email protected]/Users/user_name/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/named_scope.rb:87> ]
Cela me semble être un tableau de valeurs clés /, la clé étant le symbole de la portée du nom, et la valeur étant un Proc pointant vers le named_scope.rb fichier dans ActiveRecord.
Si je veux le hachage ou Proc donné que la portée réelle du nom (qui signifie pour: classique, je recevrais « : conditions => {: build_date < = 1969} », comment pourrais-je faire pour trouver ce
?Je vous écris un plugin conditionnel se confond quelques named_scopes, et je me présente contre une certaine résistance en ce qui concerne ce J'utilise actuellement ce qui suit pour fusionner ces champs d'application:.
scopes_to_use = Automobile.scopes
scoped_options = {}
Automobile.scopes.each do |scope|
scoped_options.safe_merge!(eval "Automobile.#{scope}(self).proxy_options")
end
Ignorant la « justesse » de ce que je fais ici, y at-il une meilleure façon que je puisse récupérer le hachage réel ou Proc donné à named_scope? Je n'aime pas utiliser 'eval' dans cette fonction, et si je pouvais récupérer le Hash ou le Proc, je serais capable d'introduire une logique de fusion beaucoup plus puissante. Toutes les pensées à ce sujet seraient très appréciées. Merci. Les portées nommées que vous définissez dans votre exemple ne feraient rien.
Cette solution semble viable, mais elle est plutôt plus intensive que je ne le voudrais à ce stade. Je cherchais quelque chose de disponible directement via l'API de rails que j'avais peut-être manqué, mais si rien n'existe exactement, alors je pense que je préférerais trouver une autre solution à mon problème global qu'une question discutable utilisant des portées nommées. Merci pour votre réponse. Il a certainement répondu à ma question, mais a également soulevé un peu plus pour moi. Si la solution est si complexe, alors mon but doit être faux. – Synthlabs
Ce n'est pas important à ce stade, mais j'ai appris l'existence de l'opérateur *. J'ai édité la solution pour l'utiliser à la place de l'eval. – EmFi
J'ai rencontré le même problème, c'est triste que la seule solution est la suivante. –