Как использовать 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