Alias ​​per i nomi delle colonne in Rails

Nel mio database ha nomi di colonne come “cancella” o “ascolta controllo” e così via. Questi non possono essere modificati, quindi mi piacerebbe fare l’alias dei nomi in modo da evitare problemi nella mia applicazione.

Ho trovato il seguente codice ma è obsoleto (5 agosto 2005) e non funziona con 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 

Come posso fare l’alias dei nomi delle colonne? È ansible?

Dichiaralo nel tuo modello.

 alias_attribute :new_column_name, :column_name_in_db 

I nomi dei metodi di aliasing non risolveranno il tuo problema. Come ho accennato nel mio commento sopra, non puoi avere trattini nel metodo ruby ​​o nomi di variabili, perché ruby ​​li interpreterà come un “meno”. così:

 object.listen-control 

sarà interpretato da ruby ​​come:

 object.listen - control 

e fallirà. Lo snippet di codice che hai trovato potrebbe non funzionare a causa di Ruby 1.9, non di rails 3. Ruby 1.9 non ti permette di chiamare. .send su metodi protetti o privati, come ad esempio 1.8.

Detto questo, capisco che ci sono momentjs in cui i vecchi nomi delle colonne del database non sembrano molto belli e si desidera pulirli. Crea una cartella nella cartella lib chiamata “bellmyer”. Quindi crea un file chiamato “create_alias.rb” e aggiungi questo:

 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 

Ora nel tuo modello che ha bisogno di alias, puoi farlo:

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

E sarà alias correttamente. Sta usando i metodi read_attribute e write_attribute di ActiveRecord per accedere a quelle colonne della tabella senza chiamarle come metodi ruby.

Come diceva Jaime, quei nomi potrebbero causare problemi.

In tal caso, utilizzare alcuni nomi sensibili. La tua GUI non dovrebbe mai imporre come vengono denominate le tue colonne.

Suggerimenti: is_deleted o deleted_at , listen_control

Quindi, modifica la visualizzazione di conseguenza, è molto più semplice rispetto alla lotta contro ActiveRecord e il tuo database.