我有一个'审计'具有名称的模型:字符串和数据:hstore属性 - 如下所示:
#<Audit
id: 1,
name: "my audit",
data: {"publisher"=>"some publisher", "display_version"=>"17.012.20098"},
created_at: "2017-10-10 13:09:56",
updated_at: "2017-10-10 13:09:56">
我想生成一个包含3列的报告: name,display_version,count
为了达到这个目的,我假设我需要按照&#34; name&#34;和&#34;数据 - &gt; &#39; display_version&#39;&#34;
我正在努力解决查询和AR语法问题。
到目前为止我所拥有的是:
Parent.audits.group(:name, :data -> 'display_version)'
即使这样也行不通。有人可以帮忙吗?我没有运气就搜索了一些例子。
答案 0 :(得分:1)
您可以将包含SQL分组表达式的字符串传递给group
,这样您就可以说:
Parent.audits.group(%q{name, data -> 'display_version'})
或:
Parent.audits.group(%q{audits.name, audits.data -> 'display_version'})
然后你可以在最后抛出一个#count
来获取你想要的数据:
Parent.audits.group(%q{name, data -> 'display_version'}).count
答案 1 :(得分:0)
使用jsonb
代替hstore
(出于各种原因)
&#39;审计&#39;名称的模型:字符串和数据:jsonb
<强> Audit.rb 强>
store_accessor :data, :publisher, :display_version
然后尝试:
Parent.audits.pluck(:name, :publisher, :display_version)
<强> Good Resource on JSONB and Postgresql 强>
hstore列不允许嵌套结构;它们还将所有值存储为字符串,这将需要在数据库和应用程序层上进行类型强制。使用json / jsonb列,您没有这个问题;数字(整数/浮点数),布尔值,数组,字符串和空值被接受,你甚至可以以任何你想要的方式嵌套结构。
建议您停止使用hstore而使用jsonb; 请记住,你必须使用PostgreSQL 9.4+来实现这个目的。