Come posso usare ActiveRecord su un database che ha una colonna chiamata 'valida'? (DangerousAttributeError)

StackOverflow https://stackoverflow.com/questions/1510875

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!

È stato utile?

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'

http://goo.gl/OO2H7

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top