/ / Wie kann ich ActiveRecord für eine Datenbank mit einer Spalte namens "valid" verwenden? (DangerousAttributeError) - Ruby-on-Rails, Activerecord, Informix

Wie kann ich ActiveRecord in einer Datenbank verwenden, die eine Spalte mit dem Namen "gültig" enthält? (DangerousAttributeError) - Ruby-on-Schienen, Aktiverecord, Informix

Ich greife auf eine Datenbank zu, die ich nicht ändern kann, und sie hat eine Spalte mit dem Namen gültig definiert. Jedes Mal, wenn ich versuche, auf ein Attribut zuzugreifen, erhalte ich die folgende Ausnahme:

gültig? wird durch ActiveRecord definiert (ActiveRecord :: DangerousAttributeError)

Die Ausnahme ist sinnvoll, aber da ich die Datenbank nicht ändern kann, wie kann ich diesen Fehler umgehen?

Ich habe versucht, das Attribut zu "überschreiben", aber ich tue es nichtwissen, wie man die ursprüngliche Spalte entfernt. Ich kann diese valid_column-Methode erfolgreich aufrufen, aber jedes Mal, wenn ich versuche, auf ein anderes in der Datenbank definiertes Attribut zuzugreifen, erhalte ich dieselbe Ausnahme. Es scheint immer noch zu versuchen, die gültige Spalte zuzuordnen.

  def valid_column=(valid)
write_attribute(:valid, valid)
end
def valid_column
read_attribute(:valid)
end

Ich bin nicht sicher, ob es darauf ankommt, aber hier sind die Details meiner Umgebung:

  • Windows Ruby 1.8.6
  • Informix-Datenbank auf einem Linux-Server
  • Aktiverecord (2.3.4)
  • activerecord-informix-adapter (1.0.0.9250)
  • Ruby-Informix (0.7.1)

Danke im Voraus!

Antworten:

11 für die Antwort № 1

Versuche dies:

class MyTable < AR:Base
class << self
def instance_method_already_implemented?(method_name)
return true if method_name == "valid"
super
end
end
end

Es ist ein Hack, und es funktioniert möglicherweise nicht in Rails 3, aber es könnte das Problem vorerst beheben.

Ich habe es auf der gefunden Ruby on Rails Mailingliste

Wenn du willst, könntest du auch schauen Datamapper, der mit solchen Dingen etwas vernünftiger umgeht.


4 für die Antwort № 2

Verwende safe_attributes - https://github.com/bjones/safe_attributes . Es funktioniert einwandfrei ab Werk:

class WebsiteUser < ActiveRecord::Base
establish_connection "cf_website"
set_table_name "nc_users"
bad_attribute_names :hash
end

3 für die Antwort № 3

Für Lesezugriffe können Sie möglicherweise die select-as-Anweisung von SQL verwenden. Sie sind sich nicht sicher, ob das Folgende funktioniert, ein Standardbereich kann dies jedoch auf einfache Weise ermöglichen.

class MyRecord < ActiveRecord::Base
default_scope :select=> "valid as valid_column"
end

3 für die Antwort № 4

Fügen Sie einfach einen Edelstein in Ihre Gem-Datei ein, ohne sich um die reservierten Attribute von ActiveRecord zu kümmern, und der Edelstein kümmert sich automatisch um Namenskollisionen.

gem "safe_attributes"

http://goo.gl/OO2H7