Rails通过保存到列的哈希的键值查询对象?

时间:2015-12-17 15:58:36

标签: mysql ruby-on-rails ruby postgresql hash

我有两个对象,访客和活动。参观者有多个活动。事件存储像这样的参数......

#<Event id: 5466, event_type: "Visit", visitor_token: "c26a6098-64bb-4652-9aa0-e41c214f42cb", contact_id: 657, data: {"url"=>"http://widget.powerpress.co/", "title"=>"Home (light) | Widget"}, created_at: "2015-12-17 14:51:53", updated_at: "2015-12-17 14:51:53", website_id: 2>

如您所见,有一个名为data的序列化文本列,用于存储包含更多数据的哈希值。

我需要查看一个访问者是否访问了某个页面,如果url参数是它自己的列,或者哈希是一个hstore列,那么这将非常简单,但它最初并没有这样设置它是已保存哈希的一部分。

这是我尝试过的rails查询...

visitor.events.where("data -> url = :value", value: 'http://widget.powerpress.co/')

visitor.events.where("data like ?", "{'url' => 'http://widget.powerpress.co/'}")

visitor.events.where("data -> :key LIKE :value", :key => 'url', :value => "%http://widget.powerpress.co/%")

如何正确查询postgres以查找包含具有特定值的键的哈希的对象?

3 个答案:

答案 0 :(得分:1)

我怀疑你没找到正确的字符串。它应该是"url"=>"http://widget.powerpress.co/",所以:

visitor.events.where("data like ?", '%"url"=>"http://widget.powerpress.co/"%')

直接在DB中检查正确的值。

答案 1 :(得分:0)

如果要在文本列中存储哈希,请尝试以下操作:

visitor.events.select{|ve| eval(ve.data)["url"] == "http://widget.powerpress.co/"}

希望,这有帮助!

答案 2 :(得分:0)

它对我有用。

 visitor.events.select { |n| n.data && n.data['url'] == "http://widget.powerpress.co/"}