Запрос событий Ahoy Gem

Я использую гем Ahoy в приложении Rails 4.2. Ahoy Events хранит события с рядом текстовых атрибутов и атрибутом properties, который содержит данные, которые я хочу запросить. Например, вот последнее событие, которое я возвращаю через консоль rails.

>> Ahoy::Event.last Ahoy::Event Load (3.8ms) SELECT "ahoy_events".* FROM "ahoy_events" ORDER BY "ahoy_events"."id" DESC LIMIT 1 => #<Ahoy::Event id: "fffff17f-44e6-41d7-9c32-fa895338f54e", visit_id: "6b05b1ca-3863-46da-9c48-a3ab5fa4a9ee", user_id: 1, name: "$click", properties: {"tag"=>"a", "page"=>"/conversations/2", "text"=>"View", "href"=>"/conversations/2"}, time: "2015-08-23 13:25:51">

Как мне получить все события, где properties['text'] = 'View'

Я пробовал Ahoy::Event.where(:properties['text'] => 'View').count

который возвращает: ```

Ahoy::Event.where(:properties['text'] => 'View').count NoMethodError: неопределенный метод to_sym' for nil:NilClass from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1/lib/active_record/sanitization.rb:59:inblock в expand_hash_conditions_for_aggregates' из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0 /gems/activerecord-4.2.5.1/lib/active_record/sanitization.rb:58:in each' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1/lib/active_record/sanitization.rb:58:inexpand_hash_conditions_for_aggregates из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1 /lib/active_record/relation/query_methods.rb:957:in build_where' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1/lib/active_record/relation/query_methods.rb:584:inwhere!' из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1/lib/active_record/relation/query_methods.rb:574:in where' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activerecord-4.2.5.1/lib/active_record/querying.rb:10:inwhere' from (irb):13 из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/railties-4.2.5.1/lib/rails/commands/console.rb:110:in start' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/railties-4.2.5.1/lib/rails/commands/console.rb:9:instart' из /Users/dariusgoore/ development/blackops/.bundle/gems/ruby/2.2.0/gems/railties-4.2.5.1/lib/rails/commands/commands_tasks.rb:68:in console' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/railties-4.2.5.1/lib/rails/commands/commands_tasks.rb:39:inrun_command!' из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/railties-4.2.5.1/lib/rails/commands.rb:17:in <top (required)>' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:inrequire' из /Users/dariusgoore/development/ blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in block in require' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:240:inload_dependency' из /Users/dariusgoore/development/blackops/.bundle/gems/ruby /2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in require' from /Users/dariusgoore/development/blackops/bin/rails:8:in' из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport -4.2.5.1/lib/active_support/dependencies.rb:268:in load' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:268:inblock in load из /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib /active_support/dependencies.rb:240:in load_dependency' from /Users/dariusgoore/development/blackops/.bundle/gems/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:268:inload' из /Users/dariusgoore/.rubies/ruby-2.2.1/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in require' from /Users/dariusgoore/.rubies/ruby-2.2.1/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:inrequire' `` `

Я безуспешно искал в Интернете запросы на хеш-атрибуты. Любое руководство очень ценится.


person user2799827    schedule 02.03.2016    source источник


Ответы (2)


Ahoy::Event на самом деле не возвращает ничего полезного. Чтобы получить все записи в возвращаемом объекте массива, вам нужно использовать Ahoy::Event.all.

Итак, что вам действительно нужно сделать, это что-то вроде этого:

Ahoy::Event.all.select { |event| event.properties['text'] == "View" }.size

Время выполнения не будет таким хорошим, но я думаю, что это то, что вам нужно.

person Jeff    schedule 02.03.2016
comment
вы правы, время выполнения ничего хорошего, но я возьму его. Большое спасибо! - person user2799827; 02.03.2016

Используйте Ahoy::Event.where("properties ->> 'text' = 'View'") намного быстрее, чтобы использовать действительный синтаксис запроса JSONB.

person holodigm    schedule 18.05.2017