【问题标题】:Rails query objects by key value of hash saved to column?Rails通过保存到列的哈希键值查询对象?
【发布时间】:2016-03-24 04:15:10
【问题描述】:

我有 2 个对象,访客和事件。访客有多个事件。事件存储这样的参数...

#<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 以查找具有包含具有特定值的键的散列的对象?

【问题讨论】:

  • data 列是字符串?

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


【解决方案1】:

我怀疑您不是在寻找正确的字符串。应该是"url"=&gt;"http://widget.powerpress.co/",所以:

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

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

【讨论】:

  • 当它运行时它不会返回任何东西(顺便说一句,肯定有带有该 url 的事件)。我可以成功运行Event.where("data like ?", '%http://widget.powerpress.co/%'),但这包括带有 /blog 等 URL 的事件。有什么解决方法吗?
  • 您可以在您的帖子中添加数据库中data 列的实际值吗?您发布了 Rails 的示例,但 DB 中的格式可能不同。
  • Event.last.attributes_before_type_cast 返回{"id"=&gt;"5466", "event_type"=&gt;"View", "visitor_token"=&gt;"c26a6098-64bb-4652-9aa0-e41c214f42cb", "contact_id"=&gt;"657", "data"=&gt;{"url"=&gt;"http://widget.powerpress.co/", "title"=&gt;"Home (light) | Widget", "page"=&gt;"/", "time"=&gt;"1450363908.892", "contactable_name"=&gt;"overlay theme 8"}, "created_at"=&gt;"2015-12-17 14:51:53.9496", "updated_at"=&gt;"2015-12-17 14:51:53.9496", "website_id"=&gt;"2", "tag_id"=&gt;nil, "contactable_type"=&gt;"Overlay", "contactable_id"=&gt;"87", "visitor_id"=&gt;"117", "broadcast_id"=&gt;nil, "flow_id"=&gt;"7", "stage_id"=&gt;nil, "goal_id"=&gt;"5", "url"=&gt;nil}
【解决方案2】:

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

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

希望,它会有所帮助!

【讨论】:

  • TypeError: no implicit conversion of Hash into String
  • 有趣。请从 rails 控制台发布Event 的输出。
【解决方案3】:

它对我有用。

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

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多