2009-10-02 10 views
14

Uzyskuję dostęp do bazy danych, której nie mogę zmienić i która ma zdefiniowaną kolumnę o nazwie valid. Za każdym razem, gdy próbuję uzyskać dostęp do atrybutu, otrzymuję ten wyjątek:Jak korzystać z ActiveRecord w bazie danych z kolumną o nazwie "valid"? (DangerousAttributeError)

ważny? jest określona przez ActiveRecord (ActiveRecord :: DangerousAttributeError)

Wyjątkiem ma sens, ale ponieważ nie jestem w stanie zmienić bazę danych, w jaki sposób można uzyskać wokół tego błędu?

Próbowałem "przesłonić" atrybut, ale nie wiem, jak usunąć oryginalną kolumnę. Mogę pomyślnie wywołać tę metodę valid_column, ale zawsze, gdy próbuję uzyskać dostęp do innego atrybutu zdefiniowanego w bazie danych, otrzymuję ten sam wyjątek. Nadal wydaje się próbować odwzorować prawidłową kolumnę.

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

Nie jestem pewien, czy to ważne, ale tutaj są szczegóły mojego środowiska:

  • systemu Windows Ruby 1.8.6
  • bazy danych Informix na serwerze Linux
  • (ActiveRecord 2.3.4)
  • activerecord-informix-adapter (1.0.0.9250)
  • ruby-informix (0.7.1)

Z góry dziękuję!

Odpowiedz

11

Spróbuj tego:

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

Jest to hack, i to może nie działać w szynach 3, ale może to rozwiązać problem teraz.

Znalazłem go na ruby on rails mailing list

Jeśli chcesz, możesz też zajrzeć na datamapper, który obsługuje ten rodzaj rzeczy nieco bardziej zdrowo.

+1

Być może trzeba zmienić 'return true jeśli method_name ==„valid'' do 'return true jeśli method_name == 'ważne?'', Aby zmusić go do pracy. Zrobiłem. –

+0

Znak zapytania wydaje się być potrzebny w szynach 3. – Kelvin

3

Dla odczytów można użyć instrukcji SQL select-as. Nie jestem pewien, czy poniższe działanie zadziała, ale domyślny zakres może sprawić, że stanie się to łatwe.

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

Bez martwienia się o zarezerwowanych atrybuty ActiveRecord, tuż dodać gem w gemfile a gem automatycznie dbać o kolizji nazw.

gem 'safe_attributes' 

http://goo.gl/OO2H7

+0

co, jeśli obiekt jest już utworzony? Podczas próby uzyskania dostępu do 'myobj.association' pojawia się błąd w moim obiekcie.Obiekt został stworzony przed dodaniem klejnotu do mojego pliku gem. Dzięki. – daveomcd

Powiązane problemy