Как я могу использовать ActiveRecord в базе данных, в которой есть столбец с именем «attribute»?(DangerousAttributeError) - PullRequest
2 голосов
/ 25 марта 2011

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

атрибут? определяется ActiveRecord (ActiveRecord :: DangerousAttributeError)

мой код:

class User < ActiveRecord::Base
      def self.authenticate(username,password)
        where(:username => username, :value => password).first
      end
end

Я нашел план в списке рассылки ruby ​​on rails для решения проблемы, но у меня не работает

  class << self
    def instance_method_already_implemented?(method_name)
      return true if method_name == 'attribute'
      super
    end
  end

Я не уверен, имеет ли это значение, но вот подробности моего окружения:

  • ruby ​​1.9.2p0 (редакция 2010-08-18 29036) [x86_64-darwin10.4.0]
  • Рельсы
  • 3.0.1 activerecord (3.0.1) activeresource (3.0.1)
* * UPDATE: 1 022 (решена): * * тысячу двадцать-три

ПЛАН А:

select("username, value").where(:username => username, :value => password).first

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Запросы ActiveRecord поддерживают параметр :select, который позволяет вам определять поля, которые вы хотите вернуть в виде строки.

Обычно люди используют что-то вроде:

:select => 'field1, field2'

Если вы знаете необработанный язык запросов для вашего сервера базы данных, вы можете использовать его в строке выбора. При выборе полей с использованием SQL можно использовать модификатор as:

select field1 as the_first_field, field2 as the_second_field

и база данных будет возвращать поля, используя новые имена полей вместо старых имен полей. Это простой способ управления устаревшими полями, которые имеют имена, конфликтующие с Rails, если ваша база данных поддерживает это.

См. "Научитесь любить ActiveRecord: выберите параметр" в " Пять советов ActiveRecord " и " Выбор определенных полей " в руководствах по Ruby on Rails.

Вот пример одного из моих приложений на Rails, использующего rails console для доступа к моей базе данных Postgres:

ruby-1.9.2-p180 :007 > dn = DomainName.first
 => #<DomainName id: 1, domain_name: "ip72-208-155-230.ph.ph.cox.net", created_at: "2010-04-20 05:53:22", updated_at: "2010-04-20 05:53:22"> 
ruby-1.9.2-p180 :008 > dn = DomainName.first(:select => 'id, domain_name as dn')
 => #<DomainName id: 1> 
ruby-1.9.2-p180 :009 > dn['id']
 => 1 
ruby-1.9.2-p180 :010 > dn['dn']
 => "ip72-208-155-230.ph.ph.cox.net"
1 голос
/ 25 марта 2011

Для столбца x ActiveRecord создает методы x, x= и x?.Итак, обновите ваше исправление так:

class << self
    def instance_method_already_implemented?(method_name)
        return true if method_name == 'attribute?'
        super
    end
end
0 голосов
/ 25 марта 2011

Может быть, вы можете использовать alias_attribute и, таким образом, использовать методы с разными именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...