2011-09-28 1 views
1

Une gemme que j'ai utilisée ajoute des méthodes aux modèles. Il a récemment mis à jour ses noms de méthode de sorte que l'un des noms de méthodes soit maintenant identique à l'un des attributs de base de données préexistants de mon modèle.Ruby on Rails: Mise à jour d'une gemme qui bouscule l'attribut préexistant de mon modèle, les options?

Existe-t-il des solutions de contournement à ce problème autres que renommer la colonne dans ma base de données et mettre à jour tout mon code si je souhaite rester à jour avec la gemme? Dans le cas où cela serait utile, pour rendre cela plus concret, la gemme est PaperTrail, qui ajoute le suivi de version aux modèles. Mon modèle avait un attribut préexistant dans la base de données appelé version_name, que la dernière version de PaperTrail vient d'ajouter en tant que class_attribute version_name qui est utilisé par PaperTrail pour définir le nom d'une autre méthode.

Répondre

1

Pas si familier avec PaperTrail (même si j'ai eu l'intention d'y jeter un coup d'œil). En supposant Papertrail ne dispose pas d'une option de configuration pour changer le nom de * version_name *, vous pouvez probablement contourner cette façon dans votre modèle:

class Thingy 
    def version_name_attr 
    attributes['version_name'] 
    end 

    def version_name_attr=(val) 
    attributes['version_name'] = val 
    end 
end 

utiliser seulement * version_name_attr * chaque fois que vous voulez accéder à votre attribut, et * verson_name * quand vous voulez la méthode PaperTrail.

Quelque chose comme ceci est un peu plus propre, mais pourrait casser des choses si PaperTrail utilise * version_name * en interne.

class Thingy 
    alias_method :paper_trail_version_name, :version_name 
    def version_name 
    attributes['version_name'] 
    end 
end 

Dans ce cas, utilisez * paper_trail_version_name * lorsque vous souhaitez utiliser la méthode PaperTrail. L'accès à votre attribut resterait tel que vous l'attendiez.

Questions connexes