Как я могу использовать ActiveRecord в базе данных, в которой есть столбец с именем 'valid'? (DangerousAttributeError) - PullRequest
14 голосов
/ 02 октября 2009

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

действует? определяется 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)

Заранее спасибо!

Ответы [ 4 ]

11 голосов
/ 04 октября 2009

Попробуйте это:

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

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

Я нашел его в списке рассылки ruils on rails

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

4 голосов
/ 02 февраля 2012

Использовать атрибуты 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 голосов
/ 07 декабря 2012

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

gem 'safe_attributes'

http://goo.gl/OO2H7

2 голосов
/ 02 октября 2009

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

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