ActiveRecord:: DangerousAttributeError
Мне нужно подключиться к существующей базе данных, используемой нашим сервером freeradius. В одной таблице есть столбец, называемый атрибутом, к которому я пытаюсь получить доступ.
При доступе я получаю его ошибку:
ActiveRecord::DangerousAttributeError
attribute? is defined by ActiveRecord
Я попытался выбрать и переименовать этот столбец в моей модели:
def self.default_scope
Radcheck.select("attribute as newattribute")
end
Но это тоже не работает.
Может кто-нибудь порекомендовать способ обойти это? Мне бы очень хотелось переименовать столбец в рельсах!
Ответы
Ответ 1
По аналогичному вопросу я нашел этот ответ: fooobar.com/questions/362269/...
Не заботясь о том, какие атрибуты зарезервированы ActiveRecord в Rails 3.0, просто добавьте
gem 'safe_attributes'
к вашему Gemfile
, и драгоценный камень попытается автоматически позаботиться обо всех встречных именах.
Как и в случае с другим ответом, вам нужно использовать Radcheck[:attribute]
или Radcheck.read_attribute :attribute
/Radcheck.write_attribute :attribute, 'value'
для доступа к полям с внутренне зарезервированными именами, но камень гарантирует, что проверки, такие как validates_presence_of :attribute
, будут работать как обычно.
Более подробную информацию можно найти на https://github.com/bjones/safe_attributes
Ответ 2
Я никогда не сталкивался с такой ситуацией, но думаю, что это должно работать
class Radcheck < ActiveRecord::Base
default_scope :select=> 'attribute as newattribute'
end
Вы должны использовать метод экземпляра default_scope, а не первый класс
Также у вас есть возможность использовать метод экземпляра, например:
RadCheck.read_attribute :attribute
Надеюсь, что это поможет
Ответ 3
Вот решение, которое требует изменения внешней базы данных, но это очень незначительное изменение, и оно будет работать с любым именем столбца, даже "атрибутом". Никакой драгоценный камень не требуется.
В вашей внешней/устаревшей базе данных создайте представление, которое переименовывает столбец проблем. например.
CREATE VIEW radcheck_view AS (
SELECT id, username, op, value, attribute rad_attribute
FROM radcheck
);
Здесь столбец проблем переименовывается attribute
в rad_attribute
.
Не забудьте предоставить соответствующие разрешения для представления. В моем случае это использование только для чтения:
GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>';
Затем в вашей модели рельсов используйте представление как table_name
class RadiusRadcheck < RadiusExternal
self.table_name = 'radcheck_view'
end