2016-03-25 2 views
1

J'ai mes Rails 5 ApplicationRecord:Rails 5: Meilleure façon de remplacer le mappage de noms entre les modèles et les noms de tables SQL?

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 
end 

et un tas de modèles qui héritent de ApplicationRecord. Maintenant, je voudrais que chaque nom de modèle soit mappé à sa table de base de données d'une manière personnalisée. Par exemple, je peux faire:

class MyModel < ApplicationRecord 
    self.table_name = 'MY_MODELS' # overrides default 'my_models' 
end 

Mais puisque toutes les applications sont prévisibles, je pensais que je voudrais juste faire dans la classe de base:

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 

    def self.table_name 
    self.name.underscore.pluralize.upcase 
    end 
end 

... mais cela ne fonctionne pas , même si les méthodes de classe technique doivent être héritées par la sous-classe. (? Toute idée pourquoi)

J'ai aussi essayé d'ajouter une méthode qui a fait quelque chose comme ceci:

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 

    def self.inherited(subclass) 
    subclass.table_name = subclass.name.underscore.pluralize.upcase 
    end 
end 

Cela ne fonctionne pas non plus. Une idée de la meilleure façon de le faire?

+0

Je suppose que cela aurait dû marcher ou peut-être que vous avez besoin de recharger! votre serveur ou votre console pour qu'elle prenne effet. classe 'ApplicationRecord oreoluwa

Répondre

2

J'ai fini par résoudre cela en ajoutant une préoccupation qui implémente la fonction table_name pour chaque modèle.