Rails: le remplacement des ActiveRecord association de la méthode
Est-il un moyen de remplacer l'une des méthodes fournies par un ActiveRecord association?
Dire par exemple j'ai le type polymorphe has_many :par l'association:
class Story < ActiveRecord::Base
has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings, :order => :name
end
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :stories, :through => :taggings, :source => :taggable, :source_type => "Story"
end
Comme vous le savez probablement cela ajoute toute une série de méthodes associées à l'Histoire du modèle, comme les tags, les balises<< tags=, tags.vide?, etc.
Comment puis-je aller sur la substitution de l'une de ces méthodes? Plus précisément les balises<< méthode. Il est assez facile de remplacer une classe normale méthodes mais je n'arrive pas à trouver des renseignements sur la façon de remplacer les modalités d'association. Faire quelque chose comme
def tags<< *new_tags
#do stuff
end
produit une erreur de syntaxe quand il est appelé ainsi, il n'est évidemment pas aussi simple que cela.
- Qu'essayez-vous de le faire pour? Ceci pourrait briser autres ActiveRecord fonctionnalité, et il y a sans doute une meilleure façon de faire ce que vous essayez
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le bloc avec
has_many
pour étendre votre association avec des méthodes. Voir le commentaire "l'Utilisation d'un bloc d'étendre vos associations" ici.Surchargeant les méthodes existantes fonctionne aussi, je ne sais pas si c'est une bonne idée cependant.
super
faire l'affaire?has_one
=/.Si vous souhaitez accéder, le modèle lui-même dans les Rails 3.2 vous devez utiliser
proxy_association.owner
Exemple:
Voir la documentation
Je pense que vous avez voulu
def tags.<<(*new_tags)
pour la signature, qui devrait fonctionner, ou de la suivante, qui est l'équivalent, et un peu plus propre si vous avez besoin de remplacer plusieurs méthodes.tags
méthode.tags
, ce qui est probablement un tableau. Cela a pour effet de l'ajout d'une nouvelle méthode d'instance de la matrice, ce qui est ce que j'ai compris la question originale à poser.extend
a un sens précis en ruby et ce n'est pas ce qui se passe ici.Vous devez définir les balises méthode retourne un objet qui a une
<<
méthode.Vous pourriez le faire comme cela, mais j'ai vraiment ne vous le recommande pas. Vous feriez beaucoup mieux de simplement ajouter une méthode à votre modèle qui correspond à ce que vous voulez que d'essayer de remplacer quelque chose de ActiveRecord utilise.
Essentiellement, cela fonctionne par défaut
tags
méthode ajoute une << méthode de l'objet et renvoie cet objet. Cela peut être un peu gourmand en ressource, car elle crée une nouvelle méthode à chaque fois que vous l'exécutezLa méthode que j'utilise est d'étendre l'association. Vous pouvez voir la façon dont je gère la "quantité" attributs ici: https://gist.github.com/1399762
Il permet essentiellement de faire de
Sans savoir exactement ce que vous espérez atteindre en surchargeant les méthodes de ses difficile de savoir si vous pourriez faire de même.
Cela peut ne pas être utile dans votre cas, mais qui pourrait être utile pour d'autres personnes à la recherche dans ce.
Association Rappels:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Exemple de la doc:
Voir aussi Association Extensions:
Rails guides documents sur la substitution de l'ajout des méthodes directement.
OP problème avec prépondérant
<<
est probablement la seule exception à cette règle, pour qui le suivent la réponse sommet. Mais il ne serait pas travailler pourhas_one
's=
attribution de la méthode ou des méthodes de lecture.