Rails 4查询hstore数组?

时间:2014-08-10 16:45:56

标签: ruby-on-rails arrays postgresql-9.3 hstore ruby-on-rails-4.1

我在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"]

一些想法?

谢谢,帕特里克

3 个答案:

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

以下答案让您了解如何执行此操作。

https://stackoverflow.com/a/22290601/1436131

答案 2 :(得分:0)

试试这个: Review.where("answers ->> 'qid' = '299'").first.answers['val']