7
votes

Résoudre un conflit de nom de classe dans une demande de rails

J'ai construit une application Rails qui effectue des fonctionnalités de comptabilité. Dans ce cas, j'ai un modèle avec le nom de la classe transaction . Jusqu'à présent, j'ai construit cette fonctionnalité pendant environ un mois, et tout fonctionne comme prévu.

Jusqu'à présent ...

Je viens de découvrir certaines fonctionnalités de rapport plus anciennes développées Il y a des mois, l'utilisation de la bibliothèque Ruport a cessé de fonctionner. Il semble que le ruporter, lors de la génération de PDF, nécessite une bibliothèque qui a également une classe / module nommée transaction . xxx

donc, je cherche pour une solution rapide ici. Celui qui, espérons que n'implique pas de renommer mon transaction modèle et refactorise les dernières semaines de code.

Dans l'attente de quelques suggestions intelligentes :) >


0 commentaires

3 Réponses :


1
votes

Votre problème peut provenir du fait que la transaction est également un mot réservé dans des rails ...


2 commentaires

Rails est juste une bibliothèque de rubis, il ne peut pas ajouter de mots-clés à la langue rubis.


Cela pourrait être une bibliothèque, mais elle peut imposer des limites à la nommage des choses en l'utilisant (même si celles-ci sont de cause non appliquées par la langue). Il suffit de regarder les problèmes que vous entrez lorsque vous essayez d'utiliser le nom de la colonne 'Type' ...



8
votes

Je crois que le problème est à ruréer obliger le PDF :: Gem de l'écrivain, qui nécessite à son tour la transaction :: GEM simple qui définit la transaction du module.

Il y a certainement une méthode #Transaction à Aciverecord, mais je Ne pensez pas qu'il existe un module de transaction ou une classe dans les rails. Je serai heureux d'être corrigé sur celui-là. P>

Nomspacing est généralement la meilleure pratique pour éviter de nommer des conflits comme celui-ci. Par exemple. p> xxx pré>

Cependant, les modèles de noms de noms de noms de noms peuvent vomir d'autres problèmes. P>

Jusqu'à ce qu'il y a du temps, la renommation de votre modèle de transaction peut être le meilleur choix . P>

Vous pouvez toujours conserver votre table de base de données de transactions existante si vous le souhaitez, vos migrations n'ont donc pas besoin de modifier, en mettant self.table_name = "transactions" code> à l'intérieur de votre modèle. P>

Vos associations avec d'autres modèles peuvent également être nommées «Transaction (s)» en spécifiant le nom de classe dans votre appel d'association. E.g. P>

class User < ActiveRecord::Base

  has_many :transactions, :class_name => "AccountTransaction"

end


2 commentaires

Merci. J'ai changé votre réponse à la réponse acceptée car il décrit plus précisément le problème spécifique que j'ai - bien que Yannis, la réponse est également correcte! En fin de compte, j'ai eu recours à la renommée de mon modèle, de la table de base de données et de toutes les associations en utilisant de l'ancienne recherche et remplacez;)


Dans la version plus récente des rails, set_table_name est juste self.table_name = , voir API.RubyonRails.org/classes/acterecord/Modelschema/...



15
votes

déjà répondu et vieux, mais je suis venu ici avec le même problème, mais j'ai résolu de la manière différente.

J'ai deux modèles nommés tire et interroger. Essayer de référencer Query.Some_Static_Method () Dans une méthode dans la traction a abouti à une requête Résolution sur Activerecord :: attributemethods :: Query: module . .

résolu en mettant l'espace de noms vide devant celui-ci avec :: Query.Some_Sticatic_Method ()


4 commentaires

Belle réponse, je ne savais pas sur l'espace de noms vide!


Solution élégante. Pourriez-vous expliquer exactement pourquoi / comment ça marche?


@ cph2117, tout ce qui est vraiment est explicite sur quel espace de noms est de trouver requête .


Homme, tu mérites une médaille