2010-12-13 81 views
3

J'utilise Devise pour l'authentification, donc je l'ai Aliased quelques colonnes dans ma base de données existante pour accueillir comme suit:Rails 3: alias_attribute et erreur colonne 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 

Quand je posterai à mes/utilisateurs/forme sign_in, je reçois l'exception suivante:

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 

Je suppose que je suis en supposant que alias_attribute éclaireraient ActiveRecord d'utiliser le nom réel de la colonne (UserId) et non l'alias (nom d'utilisateur). Qu'est-ce que je fais mal?

Répondre

6

Arel (celui qui effectue les requêtes SQL) ne connaît toujours pas les alias d'ActiveRecord (jusqu'à 3.0.3). Vous devez vous assurer que la requête est faite en utilisant le nom d'origine, LoginId, dans ce cas.

Si vous entrez dans la console et créez un User.where (: username => "root"), vous voyez qu'il génère une erreur, bien que User.username fonctionne bien.

Pour l'instant, il suffit de remplacer les occurrences du nom d'utilisateur sur la forme sinup jusqu'à ce que l'amont commence à le prendre en charge.

EDIT: Au fait, la manière recommandée est de faire voir! N'oublie pas ça! http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009