Подтвердить что ты не робот

ActiveRecord:: DangerousAttributeError

Мне нужно подключиться к существующей базе данных, используемой нашим сервером freeradius. В одной таблице есть столбец, называемый атрибутом, к которому я пытаюсь получить доступ.

При доступе я получаю его ошибку:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord

Я попытался выбрать и переименовать этот столбец в моей модели:

def self.default_scope
    Radcheck.select("attribute as newattribute")
end

Но это тоже не работает.

Может кто-нибудь порекомендовать способ обойти это? Мне бы очень хотелось переименовать столбец в рельсах!

4b9b3361

Ответ 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