如何使用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
答案 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
应该给你你的哈希