Dans ma firebase database, il y a des noms de colonne tels que «delete» ou «listen-control», etc. Ceux-ci ne peuvent pas être modifiés, alors je voudrais alias 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 colonne? C’est possible?
Déclarez ceci dans votre modèle.
alias_atsortingbute :new_column_name, :column_name_in_db
Les noms de méthode d’aliasing ne résoudront pas votre problème. Comme je l’ai mentionné dans mon commentaire ci-dessus, vous ne pouvez pas avoir de tirets dans la méthode Ruby ou de noms de variables, car Ruby les interprétera comme un “moins”. alors:
object.listen-control
sera interprété par Ruby comme:
object.listen - control
et va échouer. L’extrait de code que vous avez trouvé peut échouer à cause de Ruby 1.9, pas de rails 3. Ruby 1.9 ne vous permet plus d’appeler .send
sur des méthodes protégées ou privées, comme pour 1.8.
Cela étant dit, je comprends qu’il y a des moments où les anciens noms de colonne de firebase database ne sont pas très beaux et que vous voulez les nettoyer. Créez un dossier dans votre dossier lib appelé “bellmyer”. Ensuite, créez un fichier nommé “create_alias.rb” et ajoutez 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_atsortingbute old_name.to_s end define_method new_name.to_s + "=" do |value| self.write_atsortingbute old_name.to_s, value end end end end end
Maintenant, dans votre modèle qui nécessite un aliasing, vous pouvez le faire:
class User < ActiveRecord::Base include Bellmyer::CreateAlias create_alias 'name-this', 'name_this' end
Et il sera alias correctement. Il utilise les méthodes read_atsortingbute
et write_atsortingbute
d'ActiveRecord pour accéder à ces colonnes de table sans les appeler en tant que méthodes Ruby.
Comme Jaime l’a dit, ces noms peuvent poser problème.
Dans ce cas, utilisez des noms sensibles. Votre interface graphique ne doit jamais dicter comment vos colonnes sont nommées.
Suggestions: is_deleted
ou deleted_at
, listen_control
Ensuite, modifiez votre vue en conséquence, c’est bien plus simple que de lutter contre ActiveRecord et votre firebase database.