我希望能够在PG数据库上查询hStore列并仅返回与特定键对应的值。
数据如下所示:(请记住,:data
是postgresql hStore
)
[ id: 2, data: {"tags"=>"Ruby, Objects", "type"=>"video", "title"=>"RubyTapas: Blocks, Procs, and Lambdas"},
id: 3, data: {"tags"=>"JavaScript, Objects", "type"=>"video", "title"=>"RubyTapas: Blocks, Procs, and Lambdas"} ]
我想对此产生影响:
Model.uniq.pluck(:tags)
我期望的输出是:
Ruby, Objects, JavaScript
*我正在严格尝试使用activerecord和postgresql来实现它。
答案 0 :(得分:2)
我能够通过以下方式成功获得我想要的结果:
Model.pluck(:data).map{|j| j['tags'].split(',') }.flatten.uniq
我仍然感兴趣的是一个对map
的活跃记录关系不需要的解决方案。请告知。
答案 1 :(得分:0)
您可以定义一个类eval,使您可以访问值:
class Thing
self.class_eval do
%w[tags type title].each do |key|
scope "has_#{key}", lambda { |value| where("payload @> hstore(?, ?)", key, value) }
define_method(key) do
payload && payload[key]
end
define_method("#{key}=") do |value|
self.payload = (payload || {}).merge(key => value)
end
end
end
现在你可以使用
t = Thing.find(2)
t.type <-"video"
由于pluck返回一个字段值数组,这应该有效(尽管我还没有测试过)。