您可以为此编写一个范围。
我正在专门为 hstore 数组在 Surus 之上创建一些额外的范围。:https://github.com/jackc/surus
这个 gem 帮助了我,它已经为您提供了在常规 hstore 上工作的范围。
专门用于 hstore 数组。
在 hstore 数组上做这种工作可能非常棘手,
基本上我们想要取消嵌套数组,将其转换回 hstore,然后使用 hstore 操作数 @> 检查右手键 => 值对是否存在于左手子选择中。实现这一点的唯一方法是使用子查询。
Review.where(" exists ( SELECT * FROM ( SELECT hstore(unnest(reviews.answers))) x(item) WHERE x.item @> '"qid" => "299"')");
这应该很好用。
查看我的 fork,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
我还没有冒险进入这个世界,但肯定有可能。