2010-12-13 3 views
3

Я использую Завещание для аутентификации, поэтому я псевдонимы несколько столбцов в моей базе данных унаследованных для размещения его следующим образом:Rails 3: alias_attribute и Unkown столбец ошибки

class User < ActiveRecord::Base 

    set_table_name 'my_legacy_user_table' 
    set_primary_key 'UserId' 
    alias_attribute :id, :UserId 
    alias_attribute :username, :LoginId 
    alias_attribute :encrypted_password, :PasswordSHA1Hash 
    alias_attribute :first_name, :Name 
    alias_attribute :last_name, :Surname 

    devise :database_authenticatable, :authentication_keys => [:username] 

    attr_accessible :username, :password, :password_confirmation 

    def password_salt=(password_salt) 
    end 

    def password_salt 
    end 

    def password_digest(password) 
    self.class.encryptor_class.digest(password) 
    end 

end 

Когда я отправляю к моим/пользователям/sign_in форму, я получаю следующее исключение:

Mysql2::Error: Unknown column 'my_legacy_user_table.username' in 'where clause': SELECT `kms_User`.* FROM `my_legacy_user_table` WHERE (`my_legacy_user_table`.`username` = 'mrichman') LIMIT 1 

Я предполагаю, что я был в предположении, что alias_attribute поручит ActiveRecord использовать реальное имя столбца (USERID), а не псевдоним (имя пользователя). Что я делаю не так?

ответ

6

Arel (тот, который делает SQL-запросы) до сих пор не знает псевдонимов ActiveRecord (до 3.0.3). В этом случае вы должны убедиться, что запрос выполняется с использованием исходного имени LoginId.

Если вы входите в консоль и создаете User.where (: username => «root»), вы увидите, что она генерирует ошибку, хотя User.username работает хорошо.

Теперь просто замените вхождения пользователя в форме sinup, пока восходящий поток не начнет его поддерживать.

EDIT: Кстати, рекомендуемый способ сделать это сделать вид! Не забывайте об этом! http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009