Как использовать ActiveRecord в базе данных с столбцом с именем "valid"? (DangerousAttributeError)

Я обращаюсь к базе данных, которую я не могу изменить, и имеет столбец с именем valid defined. Каждый раз, когда я пытаюсь получить доступ к атрибуту, я получаю это исключение:

действует? определяется ActiveRecord (ActiveRecord:: DangerousAttributeError)

Исключение имеет смысл, но поскольку я не могу изменить базу данных, как мне обойти эту ошибку?

Я попробовал "переопределить" атрибут, но я не знаю, как удалить исходный столбец. Я могу успешно вызвать этот метод valid_column, но в любое время, когда я пытаюсь получить доступ к другому атрибуту, определенному в базе данных, я получаю то же исключение. Кажется, что все еще пытается отобразить действительный столбец.

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

Я не уверен, если это имеет значение, но вот подробности моей среды:

  • Windows Ruby 1.8.6
  • База данных Informix на сервере Linux
  • activerecord (2.3.4)
  • activerecord-informix-adapter (1.0.0.9250)
  • ruby-informix (0.7.1)

Спасибо заранее!

Ответы

Ответ 1

Попробуйте следующее:

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

Это взломать, и это может не работать в rails 3, но на данный момент это может решить проблему.

Я нашел его в списке ruby ​​on rails

Если вы хотите, вы также можете посмотреть datamapper, который обрабатывает такие вещи несколько более безопасными.

Ответ 2

Использовать safe_attributes - https://github.com/bjones/safe_attributes. Он отлично работает из коробки:

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

Ответ 3

Для чтения вы можете использовать инструкцию SQL select-as. Не уверен, что следующее будет работать, но область по умолчанию может сделать это легко выполнимым.

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

Ответ 4

Не заботясь о зарезервированных атрибутах ActiveRecord, просто добавьте драгоценный камень в свой gemfile, и драгоценный камень автоматически позаботится о конфликтах имен.

gem 'safe_attributes'

http://goo.gl/OO2H7