Search code examples
ruby-on-rails-3thinking-sphinx

Simple group by with thinking sphinx


I have an Item model with a name and user_id. I would like to search all Items and group by User so I can display each user with their items:

  • User 1:
    • Item A
    • Item B
  • User 2
    • Item C
  • User 3
    • Item D
    • Item E
    • Item D

...

In the console, I try this: (From the documentation)

Item.search({group_by: :user_id, limit: 50}).all

And I get this:

  Sphinx Query (0.4ms)
  Sphinx  Caught Sphinx exception: can't dup Symbol (0 tries left)
TypeError: can't dup Symbol
from /Users/pinouchon/.rvm/gems/ruby-1.9.3-p392@gemset/gems/riddle-1.5.6/lib/riddle/client/message.rb:18:in `dup'

Same error with this:

Item.search({group_by: :user_id, order_group_by: '@count desc'}).each_with_group

Search with no group by returns results without any problem.

What's wrong ?


Solution

  • The quick answer: try sending through the attribute name as a string, not a symbol.

    The longer answer: that query isn't going to give you the results you want – it'll return one item per user. You'd be better served sorting by user_id instead:

    items = Item.search(
      :order     => 'user_id ASC, @weight DESC',
      :sort_mode => :extended,
      :limit     => 50
    )
    

    From there, you could then get the layer of users grouping each items using Ruby/Rails:

    items.group_by(&:user)