使用原始sql将ruby哈希保存到postgres

时间:2014-02-24 19:18:24

标签: ruby-on-rails ruby postgresql

如何使用sql将ruby哈希直接保存到postgres?

我试过这样:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '{:sub => tralal}')

但是它将字符串插入到数据库中,如何在保存对象时插入像ruby一样的哈希值。

从rails执行insert的sql查询看起来像:

INSERT INTO "table" ("created_at", "key", "params") VALUES ($1, $2, $3) RETURNING "id"  [["created_at", Mon, 24 Feb 2014 18:53:58 UTC +00:00], ["key", "create"], ["parameters", "---\n:sub: tralal\n"]

我正在尝试使用sql进行一些插入以提高性能,但我无法弄清楚如何在db中使用hash而不是string

如果我使用转换为yaml,我会得到:

{:my => 'hash'}.to_yaml
 => "---\n:my: hash\n"

当我这样做时:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '---\n:my: hash\n')

然后,当我尝试将其恢复到rails控制台时:

MyClass.last[:parameters].keys.first
 => "---\\n:my"

我得到---\\n:my而不是:my

2 个答案:

答案 0 :(得分:1)

看起来您的代码正在将散列序列化为YAML,然后您可以在重新读取时将其反序列化。您可以使用YAML.load,它会将序列化散列转换回ruby散列。< / p>

要从数据库中手动回读yaml,您必须使用YAML解析它:

<强>更新

当我这样做时:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '---\n:my: hash\n')

我可以阅读并阅读:

model = MyClass.last
params = YAML.load model.params
=> {:my=>"hash"}

答案 1 :(得分:0)

我不确定你为什么要这样做,但是:

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'create', '{:sub => tralal}')

应该是

INSERT INTO "table" ("created_at", "key", "params") VALUES (now(), 'sub',  'tralal')

如果你想要你的关键是sub而param是tralal。

获取实际哈希到数据库的唯一方法是使用字符串,但不会像上面那样分隔您的值。它会是这样的:

INSERT INTO "table" ("created_at", "hash") VALUES (now(), '{:sub => tralal}')

在控制台中:

MyClass.last.hash

应该给你你的哈希