pablomarti
pablomarti

Reputation: 2107

Problems using Thinking Sphinx in Ruby on Rails with multiple models

I'm developing a website on Ruby on Rails with the search engine Sphinx (I'm using Thinking Sphinx). I have a model in which I want to make the searches and I'm using another models (I made the relationships in the models and in the tables) but I want to make additional INNER JOINS, so, I have something like this:

class Group < ActiveRecord::Base
        belongs_to :person
    has_many :categories, :dependent => :destroy

    define_index do
        indexes group_name
        indexes person.fullnameindexes categories.category_name
        indexes categories.category_name
    end
end

It's ok to make something like this?

class Group < ActiveRecord::Base
        belongs_to :person
    has_many :categories, :dependent => :destroy

    define_index do
        indexes group_name
        indexes person.fullnameindexes categories.category_name
        indexes categories.category_name
        indexes subcategories.subcategory_name #additional table
    end
end

As you can see, I'm adding a new model (Subcategory) that has no relationship with the model Group, but it has a relationship with the model Category, is this ok? or what is the right way to do that?

Those are the links I'm following:

http://freelancing-god.github.com/ts/en/indexing.html
http://freelancing-gods.com/posts/a_concise_guide_to_using_thinking_sphinx

Upvotes: 1

Views: 617

Answers (2)

pat
pat

Reputation: 16226

If subcategory is referenced in the Category model, you can do this:

indexes categories.subcategories.subcategory_name, :as => :subcategory_names

Thinking Sphinx will happily go through associations into deeper associations if you want it to.

Upvotes: 3

zetetic
zetetic

Reputation: 47578

I think the short answer to this is "no". ThinkingSphinx will try to reference an association on Group named subcategories, which won't exist, and you should get an error when indexing.

If Category has_many :subcategories, you can express this in Group with a :through option:

class Group < ActiveRecord::Base
  belongs_to :person
  has_many :categories, :dependent => :destroy
  has_many :subcategories, :through => :categories

and then the index should recognize the association, though the docs point out that you need an explicit alias when doing this, so:

indexes subcategories.subcategory_name, :as => 'subcategory_name'

Upvotes: 0

Related Questions