我正在尝试使用find_by_sql查询我的Devise创建的表,并且遇到了一个奇怪的错误。
User.find_by_sql("select username from user")
结果是:
PG::UndefinedColumn: ERROR: column "username" does not exist
LINE 1: select username from user
: select username from user
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:
column "username" does not exist
LINE 1: select username from user
^
: select username from user
这是我的设计迁移(我添加了用户名字段):
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :username, null: false
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
end
end
如您所见,我已经声明了字段用户名。以这种方式查询其他表可以完美地工作。我也试过了User.find_by_sql("select 'username' from user")
,那才回来[#<User id: nil>]
。
谢谢!
编辑:要添加该User.last
返回
#<User id: 1, username: "xxxxxx", email: "xxxxxxxx",
encrypted_password: "xxxxxx", reset_password_token: nil,
reset_password_sent_at: nil, remember_created_at: nil,
sign_in_count: 2, current_sign_in_at: "2016-06-26 20:16:59",
last_sign_in_at: "2016-06-25 22:00:31", current_sign_in_ip: "xxxxx",
last_sign_in_ip: "xxxx", created_at: "2016-06-25 22:00:31",
updated_at: "2016-06-26 20:16:59">
用正确的值代替“ xxxxx”
应该是因为表的名称是users
而不是user
。您可以检查schema.rb
表的名称是否为users
或user
。但是,根据迁移,它必须为users
。
这应该工作:User.find_by_sql("select username from users")
。User.find_by_sql("select id, username from users")
如果需要记录的user_id和用户名,则可以使用。
或者更确切地说,我建议您以红宝石的方式来做: User.select(:username)
希望能帮助到你 : )
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句