查询Ahoy gem属性哈希

时间:2016-06-03 20:05:10

标签: ruby-on-rails ahoy

我正在使用Ahoy gem在Rails 4应用程序中记录用户操作。正在记录事件并将其存储在Ahoy :: Event表中。每个事件都有一个properties哈希属性存储为文本。在这种情况下,我试图返回特定文章的文章视图数量。

我在这里的gem文档中遵循建议的语法:https://github.com/ankane/ahoy#querying-properties,它提供了Ahoy::Event.where("properties LIKE '%\"store_id\": \"1\"%'").count用于查询属性文本哈希的示例,但我无法返回准确的结果。

以下是我正在跟踪的控制器事件:

def show @article = Article.friendly.find(params[:id]) ... ahoy.track "Viewed article", article_id: @article.id ... end

在控制台中,正如预期的那样,当我搜索具有以下名称的文章时,我会看到返回一个事件:"已查看文章":

Ahoy::Event.where(name: "Viewed article") Ahoy::Event Load (89.1ms) SELECT "ahoy_events".* FROM "ahoy_events" WHERE "ahoy_events"."name" = $1 [["name", "Viewed article"]] => #<ActiveRecord::Relation [#<Ahoy::Event id: "6cda3790-625d-4b73-8ef0-262a26b29618", visit_id: "2d56efa6-3590-4a64-acec-c0fd0ba07727", user_id: nil, name: "Viewed article", properties: {"article_id"=>562}, time: "2016-06-03 18:49:28">]>

但是当我尝试通过查询具有相应article_id的事件来查找同一事件时,找不到该事件:

Ahoy::Event.where("properties LIKE '%\"article_id\": \"562\"%'").count (207.5ms) SELECT COUNT(*) FROM "ahoy_events" WHERE (properties LIKE '%"article_id": "562"%') => 0

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

更新:Ahoy实际上有一个很棒的where_properties方法可以满足您的需求,并将您的数据库类型考虑在内!它看起来像这样:

Ahoy::Event.where(name: "Viewed product").where_properties(product_id: 123).count

Documentation here

通过使用文本列存储属性哈希,你真的在​​上山。在将哈希值存储到数据库之前,必须将哈希值编码为文本,因此现在必须根据编码格式查询数据库(根据您使用的编码机制而不同)。啊!我的建议:

  1. 目前要做的最好的事情是将属性哈希存储在JSON列中!并非所有数据库都支持此功能,但如果可以,请务必执行此操作。然后,您可以直接查询JSON属性,甚至可以创建索引等。这就是我的工作方式,并且它的工作原理非常好。 Yay Postgres!

  2. 在内存中解码为Ruby哈希值之前,不要尝试查询属性哈希值。使用属性哈希(如user_id&amp; event_name)之外的所有内容进行最具体的查询,然后循环查看生成的Ahoy :: Event对象,检查它们在Ruby中的属性。它可能很慢,但它很简单,没有错误。对于性能优化,您始终可以在后台作业中执行此操作并缓存结果!