我正在使用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

任何建议,不胜感激。

最佳答案

更新:Ahoy实际上有一个很棒的where_properties方法,它可以执行您想要的操作,并考虑您的数据库类型!看起来像这样:

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

Documentation here



通过使用文本列存储属性哈希,您确实在上坡。哈希必须先编码为文本,然后再存储在数据库中,因此现在您必须根据编码形式(根据所使用的编码机制而有所不同)来查询数据库。啊!我的建议:


到目前为止,最好的办法是将属性哈希存储在JSON列中!并非所有数据库都支持此功能,但是如果可以的话,绝对可以这样做。然后,您可以直接查询JSON属性,甚至可以创建索引等。这就是我的方法,并且效果很好。 Yay Postgres!
在将属性哈希解码为内存中的Ruby哈希之前,请勿尝试查询属性哈希。使用属性哈希(例如user_id和event_name)以外的所有内容进行最具体的查询,然后循环遍历生成的Ahoy :: Event对象,以检查其在Ruby中的属性。它可能很慢,但是会很简单且没有错误。对于性能优化,您始终可以在后台作业中进行操作并缓存结果!

关于ruby-on-rails - 查询Ahoy gem属性哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37622530/

10-08 23:07