Вопрос

I'm trying to rewrite a query with tire.

This is the model that I have:

class User < ActiveRecord::Base
  has_many :bookmarks, :dependent => :destroy
  has_many :followed_venues, :through => :bookmarks, :source => :bookmarkable, :source_type => 'Venue'
end

A user can follow venues. And I need to search for venues that are followed by a certain users.

So far I've been doing it with ActiveRecord:

@user.followed_venues.where(["venues.title LIKE ?", "%"+params[:q]+"%"])

This is obviously not ideal, so I added elasticsearch to my app with tire.

How would I search for venues with tire, filtering by the user that is following them?

Это было полезно?

Решение

I'm going to post an answer to my own question.

So it's quite easy to just search venues. Standard Venue.tire.search {...} The problem is how to filter by user that follows venues. Instead of using the Venue model for searching, I decided to index bookmarks.

This is my bookmark model

class Bookmark < ActiveRecord::Base
  belongs_to :bookmarkable, :polymorphic => true

  def to_indexed_json
    {
      :title => bookmarkable.display_name,
      :user_id => user_id
    }.to_json
  end
end

After this I have the user_id and the venue name in the index. Now search becomes as simple as this:

Bookmark.tire.search :load => {:include => 'bookmarkable'}, :page => page, :per_page => per_page do
  query do
    fuzzy :title => { :value => query.downcase, :min_similarity => 0.6, :prefix_length => 2}
  end
  filter :terms, {:bookmarkable_type => ["Venue"], :user_id => [user.id]}
end

Now this is not a complete solution. And I hope i'm even using filter :terms correctly. The result that I get back now is an array of bookmarks actually. But it's easy to load the actual venues for them, and maybe wrap it in a WillPaginate collection for better pagination on the frontend.

Any problems with this solution? How would it compare to what phoet suggested with putting user ids to the venue index?

Другие советы

i would create a document for each venue and then add a field with an array of all the user-ids that are following.

are you really sure, that this is a proper task for elasticsearch?

i guess it would be way easier to just search the index for the name of the venue and then look up the data you need in your relational database.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top