Rails 3:别名属性和未知列错误

时间:2010-12-13 14:16:59

标签: ruby-on-rails activerecord 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

当我发布到我的/ 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

我想我假设alias_attribute会指示ActiveRecord使用真实列名(UserId)而不是别名(用户名)。我做错了什么?

1 个答案:

答案 0 :(得分:6)

Arel(进行SQL查询的那个)仍然不知道ActiveRecord的别名(最多3.0.3)。在这种情况下,您应确保使用原始名称LoginId进行查询。

如果您进入控制台并创建User.where(:username =&gt;“root”),您会看到它生成错误,尽管User.username运行良好。

现在只需替换​​sinup表单上的用户名,直到上游开始支持它。

编辑:顺便说一下,推荐的方法是做一个视图!别忘了! http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009