Come posso usare ActiveRecord su un database che ha una colonna chiamata 'valida'? (DangerousAttributeError)
-
19-09-2019 - |
Domanda
Sto accesso a un database che non posso cambiare e ha una colonna denominata valida definito. Ogni volta che provo ad accedere a un attributo, ottengo questa eccezione:
valida? è definita da ActiveRecord (ActiveRecord :: DangerousAttributeError)
L'eccezione ha un senso, ma dal momento che io non sono in grado di modificare il database, come posso ottenere intorno a questo errore?
Ho cercato "override" l'attributo, ma non so come rimuovere la colonna originale. Posso chiamare con successo questo metodo valid_column, ma ogni volta che tento di accedere a un altro attributo definito nel database, ottengo la stessa eccezione. Sembra essere ancora cercando di mappare la colonna valido.
def valid_column=(valid)
write_attribute(:valid, valid)
end
def valid_column
read_attribute(:valid)
end
Non sono sicuro se è importante, ma qui ci sono i dettagli del mio ambiente:
- di Windows Rubino 1.8.6
- database Informix su un server Linux
- ActiveRecord (2.3.4)
- activerecord-Informix-adattatore (1.0.0.9250)
- ruby-Informix (0.7.1)
Grazie in anticipo!
Soluzione
Prova questo:
class MyTable < AR:Base
class << self
def instance_method_already_implemented?(method_name)
return true if method_name == 'valid'
super
end
end
end
E 'un hack, e potrebbe non funzionare in Rails 3, ma potrebbe risolvere il problema per ora.
L'ho trovato sul Ruby on Rails mailing list
Se si volesse, si potrebbe anche guardare DataMapper , che gestisce questo genere di cose un po 'più in modo sano.
Altri suggerimenti
Utilizzare safe_attributes - https://github.com/bjones/safe_attributes . Funziona perfettamente fuori dalla scatola:
class WebsiteUser < ActiveRecord::Base
establish_connection 'cf_website'
set_table_name 'nc_users'
bad_attribute_names :hash
end
Senza preoccuparsi attributi riservati di ActiveRecord, è sufficiente aggiungere una gemma nella vostra Gemfile e la gemma si prenderà cura di conflitti di nome automaticamente.
gem 'safe_attributes'
Per legge si potrebbe essere in grado di utilizzare select-come dichiarazione di SQL. Non so se la seguente funzionerà, ma un ambito predefinito può rendere facilmente questo fattibile.
class MyRecord < ActiveRecord::Base
default_scope :select=> 'valid as valid_column'
end