为什么ActiveRecord / PostgreSQL没有在数据库中找到我的数据?

时间:2013-04-18 00:38:42

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord rails-activerecord

我确信这是一件很容易忽视的事情,但由于我已经处理了这个奇怪的问题几天,我现在正在寻求帮助。

以下是我的应用设置和问题:

带有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"

我目前在我的"客户"数据库。他们想象如下:

enter image description here

问题

当我执行一个简单的" 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 =>令牌)"能够检查并查看数据库中是否存在提供的令牌。

感谢您的帮助!

更新4/18/13 @ 9:30 am

我只是尝试Client.find(12)只是为了查看它是否会按ID找到记录,这是有效的。这并不能帮助我理解为什么我仍然无法使用Client.exists?(:private_key => token)Client.find_by_private_key(token)

2013年4月19日上午9:15

更新

这个问题的答案是生成我的private_key值的代码是在值的末尾添加一个返回/空格。因此,当尝试根据private_key查询数据库的行时,它始终无法找到任何内容。

要解决这个问题,我在生成private_key的代码末尾添加了一个gsub,就像这样......

private_key = SecurityHelper.encrypt_private_key(client_uuid).gsub(/\s+/, "")

这会从生成的私钥中删除所有空格并解决问题。

2 个答案:

答案 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")