66 votes

Alias pour les noms de colonne dans Rails

Dans ma base de données, il existe des noms de colonne tels que "delete" ou "listen-control", etc. Celles-ci ne pouvant pas être modifiées, je voudrais aliaser les noms afin d'éviter des problèmes dans mon application.

J'ai trouvé le code suivant mais il est obsolète (05 août 2005) et ne fonctionne pas avec Rails 3:

 module Legacy
  def self.append_features(base)
    super
    base.extend(ClassMethods)
  end
  module ClassMethods
    def alias_column(options)
      options.each do |new_name, old_name|
        self.send(:define_method, new_name) { self.send(old_name) }
        self.send(:define_method, "#{new_name}=") { |value| self.send("#{old_name}=", value) }
      end
    end
  end
end

ActiveRecord::Base.class_eval do
  include Legacy
end
 

Comment puis-je alias les noms de colonnes? C'est possible?

144voto

Shreyas Points 4871

Déclarez ceci dans votre modèle.

 alias_attribute :new_column_name, :column_name_in_db
 

8voto

Jaime Bellmyer Points 13815

Aliasing noms de méthode ne suffit pas à résoudre votre problème. Comme je l'ai mentionné dans mon commentaire ci-dessus, vous ne pouvez pas avoir des tirets dans la méthode ruby ou des noms de variables, parce que ruby s'interpréter comme un "moins". donc:

object.listen-control

sera interprété par ruby comme:

object.listen - control

et échouera. L'extrait de code vous avez trouvé peut-être défectueux en raison de ruby 1.9, pas de rails 3. Ruby 1.9 ne les laissez pas vous appelez .send protégées ou privées, des méthodes de plus, comme de 1,8 utilisé pour.

Cela étant dit, je comprends bien il y a des moments, lorsque le vieux de la base de données des noms de colonne n'a pas l'air très gentil, et que vous souhaitez nettoyer. Créez un dossier dans votre dossier lib appelé "bellmyer". Ensuite, créez un fichier appelé "create_alias.rb", et d'ajouter ceci:

module Bellmyer
  module CreateAlias
    def self.included(base)
      base.extend CreateAliasMethods
    end

    module CreateAliasMethods
      def create_alias old_name, new_name
        define_method new_name.to_s do
          self.read_attribute old_name.to_s
        end

        define_method new_name.to_s + "=" do |value|
          self.write_attribute old_name.to_s, value
        end
      end
    end
  end
end

Maintenant, dans votre modèle que les besoins de l'aliasing, vous pouvez faire ceci:

class User < ActiveRecord::Base
  include Bellmyer::CreateAlias
  create_alias 'name-this', 'name_this'
end

Et il sera alias correctement. C'est à l'aide de l' read_attribute et write_attribute méthodes de ActiveRecord pour accéder à ces colonnes de la table sans les appeler comme ruby méthodes.

0voto

Ariejan Points 6567

Comme Jaime l'a dit, ces noms pourraient causer des problèmes.

Dans ce cas, utilisez des noms sensibles. Votre interface graphique ne doit jamais dicter le nom de vos colonnes.

Suggestions: is_deleted ou deleted_at , listen_control

Ensuite, changez votre vue en conséquence, ce qui est bien plus facile que de combattre ActiveRecord et votre base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X