Mar*_*man 3 activerecord ruby-on-rails devise ruby-on-rails-3
我正在使用Devise进行身份验证,因此我在遗留数据库中使用了几列别名来适应它,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
当我发布到我的/ users/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
Run Code Online (Sandbox Code Playgroud)
我想我的假设是alias_attribute指示ActiveRecord使用真实列名(UserId)而不是别名(用户名).我究竟做错了什么?
Arel(进行SQL查询的那个)仍然不知道ActiveRecord的别名(最多3.0.3).在这种情况下,您应确保使用原始名称LoginId进行查询.
如果您进入控制台并创建User.where(:username =>"root"),您会看到它生成错误,尽管User.username运行良好.
现在只需替换sinup表单上的用户名出现,直到上游开始支持它.
编辑:顺便说一句,建议的方法是做一个观点!别忘了! http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009
| 归档时间: |
|
| 查看次数: |
4953 次 |
| 最近记录: |