我在postgres 9.3.2数据库的rails 4.1.4的评论表中找到了hstore数组列的答案
add_column :reviews, :answers, :hstore, array:true
的值如下:
=> [{"qid"=>"299", "val"=>"1", "field_type"=>"rating_field"}, {"qid"=>"300", "val"=>"2", "field_type"=>"rating_field"}]
我正在尝试从qid == 299获取所有值,因此输出应为1
,或者当存在多个值时为数组
我试过了:Review.where("answers -> 'qid' = '299'")["val"]
一些想法?
谢谢,帕特里克
答案 0 :(得分:1)
你可以为此写一个范围 我正在为Surus专门为hstore数组创建一些额外的范围:https://github.com/jackc/surus
这个宝石在途中帮助了我,它已经为你提供了在常规hstores上工作的范围。
专门针对hstore数组。 在hstore数组上做这种工作可能非常棘手,
基本上我们想要取消数组,将其强制转换回hstore,然后使用hstore操作数@>检查左手子选择中是否存在右手键=>值对。实现这一目标的唯一方法是使用子查询。
Review.where(" exists ( SELECT * FROM ( SELECT hstore(unnest(reviews.answers))) x(item) WHERE x.item @> '"qid" => "299"')");
这应该很好用。 查看我的前叉,https://github.com/milankubin/surus它现在将为您提供两个范围:
Model.hstore_array_has_any(column,value)#将在数组中查找匹配值的任何内容 Model.hstore_array_has_pairs(column,hash)#你要找的答案:)
=> #<ActiveRecord::Relation []>
2.1.2 :002 > Lead.hstore_array_has_pairs(:m3_data, {"name" => "3-zitsbank"})
Lead Load (2.0ms) SELECT "leads".* FROM "leads" WHERE ( exists ( SELECT * FROM ( SELECT hstore(unnest("m3_data"))) x(item) WHERE x.item @> '"name"=>"3-zitsbank"'))
=> #<ActiveRecord::Relation [#<Lead id: 35655,[.......]
hstore不支持索引。您可以索引单个键,甚至嵌套在hstore数组中。但这并不容易,并且在添加索引时需要您编写自己的索引规划器。
看看这个答案,这可能会让你开始: PostgreSQL - query against GIN index of HSTORE value
我还没有冒险进入这个世界,但这当然是可能的。
答案 1 :(得分:0)
通过这个答案
https://stackoverflow.com/a/10117278/1436131
posgresql数组只是一个字符串,因此您无法对其进行索引。相反,您可能希望查看Posgresql对JSON的本机支持,而不是他们建议的其他连接表。
http://www.postgresql.org/docs/9.3/static/functions-json.html
以下答案让您了解如何执行此操作。
答案 2 :(得分:0)
试试这个:
Review.where("answers ->> 'qid' = '299'").first.answers['val']