我确信这是一件很容易忽视的事情,但由于我已经处理了这个奇怪的问题几天,我现在正在寻求帮助。
带有pg gem和以下数据库方案的Rails 3.2.13应用程序:
create_table "clients", :force => true do |t|
t.string "uuid"
t.string "private_key"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "clients", ["private_key"], :name => "index_clients_on_private_key"
add_index "clients", ["uuid"], :name => "index_clients_on_uuid"
当我执行一个简单的" SELECT * FROM客户端;"使用RubyMine数据库控制台,我得到上面屏幕截图中的行。当我执行" SELECT * FROM客户端WHERE id = 11;"我得到那一排,一切都很顺利。然而,问题在于当我尝试执行" SELECT * FROM客户端WHERE private_key =" MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF&#34 ;;"它失败并在控制台输出中显示以下内容......
sql> SELECT * FROM clients WHERE private_key = "MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF"
[2013-04-17 20:09:51] [42703] ERROR: column "MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF" does not exist
Position: 43
我还尝试使用活动记录助手方法将这一行拉出数据库...
Client.exists?(:private_key => token)
Client.find_by_private_key(token)
然而,没有任何作用,它永远不会找到db中存在的记录。有谁知道这里发生了什么?我需要做的就是利用活动记录助手,特别是" Client.exists?(:private_key =>令牌)"能够检查并查看数据库中是否存在提供的令牌。
感谢您的帮助!
我只是尝试Client.find(12)
只是为了查看它是否会按ID找到记录,这是有效的。这并不能帮助我理解为什么我仍然无法使用Client.exists?(:private_key => token)
或Client.find_by_private_key(token)
。
这个问题的答案是生成我的private_key值的代码是在值的末尾添加一个返回/空格。因此,当尝试根据private_key查询数据库的行时,它始终无法找到任何内容。
要解决这个问题,我在生成private_key的代码末尾添加了一个gsub,就像这样......
private_key = SecurityHelper.encrypt_private_key(client_uuid).gsub(/\s+/, "")
这会从生成的私钥中删除所有空格并解决问题。
答案 0 :(得分:1)
你使用了错误的引用方式。 PostgreSQL中使用的ANSI SQL引用是:
"SELECT * FROM clients WHERE private_key = 'MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF';"
请注意单引号。
目前尚不清楚第一个语句是如何被Ruby解析的,因为内部双引号会结束引用的字符串,导致:
"SELECT * FROM clients WHERE private_key = "MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF";"
^^^^
should be Ruby syntax error here
我真的不做Rails所以我不能说正确的Rails语法来通过ActiveRecord进行检查。
答案 1 :(得分:0)
你试过吗
Client.exists?(:private_key => "MkRBNUZBQzUtMzVDRi00NzQ3LThFNjEtNjI4OThERUQzQkRF")