2010-12-03 4 views
3

J'écris une application Rails sur une base de données existante. L'une des tables de cette base de données héritée comporte une colonne nommée object_id. Malheureusement object_id est également un attribut de chaque objet dans Ruby, donc quand ActiveRecord essaye d'utiliser ces objets pour formuler une requête, il utilise le Ruby défini object_id, plutôt que la valeur qui est dans la base de données. L'application héritée est immense à plus d'un million de lignes de code, donc le simple changement du nom de la colonne dans la base de données serait une option de dernier recours.Substitution ou alias du nom de la colonne dans la base de données existante à l'aide de Rails/ActiveRecord

Questions:
1. Est-il possible de faire en sorte que ActiveRecord/Rails utilise un alias ou un synonyme pour cette colonne?
2. Y a-t-il un moyen dans Ruby de faire en sorte que la méthode object_id se comporte différemment, selon qui l'appelle?
3. Puis-je remplacer simplement le comportement de la méthode object_id dans mon modèle (je suppose que cela est une très mauvaise idée, mais a dû demander)

Toutes les suggestions sont grandement appréciés.

Répondre

2

Je suis spitballing genre d'ici, mais vous pouvez essayer quelque chose comme ceci:

class Legacy < ActiveRecord::Base 
    #... all the other stuff 

    #give yourself a way to access the DB version of object_id 
    def oid 
    attributes[:object_id] 
    end 
    def oid=(val) 
    attributes[:object_id]=val 
    end 

    #restore ruby's default #object_id implementation 
    def object_id 
    super 
    end 
end 
+0

Merci pour l'entrée. Cela aide définitivement à résoudre une partie du problème. L'autre partie du problème est qu'ActiveRecord doit appeler le nom de la colonne d'origine lorsqu'il génère des clauses where. Par exemple, quand je fais 'Object.find_by_oid (3)' il va générer 'select * from object_table où oid = 3' qui va provoquer une erreur car dans la base de données la colonne n'est pas réellement appelée oid. – mberning

+0

vous ne serez pas en mesure d'utiliser des trouveurs dynamiques pour ce champ. vous pouvez toujours utiliser object_id dans vos étendues et: clauses clauses (ou # where si vous êtes sur rails 3) – karmajunkie

+0

Je vois un problème avec cette solution, à savoir que Rails va quand même générer les méthodes d'accesseur automatique: object_id et: object_id = qui va générer un avertissement comme celui-ci: 'warning: redéfinir' object_id 'peut causer de sérieux problèmes et n'est certainement pas souhaitable. Existe-t-il un moyen de supprimer la génération automatique de méthode? –

Questions connexes