pat / thinking-sphinx

Sphinx/Manticore plugin for ActiveRecord/Rails
http://freelancing-gods.com/thinking-sphinx
MIT License
1.63k stars 469 forks source link

Unable to index polymorphic association. #942

Closed mikemerritt closed 9 years ago

mikemerritt commented 9 years ago

There seems to be little to no documentation relating to indexing polymorphic relationships in rails. But from everything I've gethered from various stackoverflow posts the following should work correctly but instead throws a "uninitialized constant Appointment::Location" error when trying to rebuild with this new index.

class Location < ActiveRecord::Base
  has_many :appointments, as: :working_location
end

class Facility < ActiveRecord::Base
  has_many :appointments, as: :working_location
end

class Appointment < ActiveRecord::Base
  belongs_to :working_location, polymorphic: true
end

ThinkingSphinx::Index.define :appointment, with: :active_record, delta: ThinkingSphinx::Deltas::ResqueDelta do
  indexes consumer.name, as: :consumer_name
  indexes professional.name, as: :professional_name
  indexes working_location.name, as: :working_location_name

  polymorphs working_location, to: %w(Location, Facility)

  has status, as: :status, type: :integer
end

Here is the full stack trace.

NameError: uninitialized constant Appointment::Location,
/Users/mike/.rvm/gems/ruby-2.2.2/gems/activerecord-4.1.12/lib/active_record/inheritance.rb:133:in `compute_type'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/activerecord-4.1.12/lib/active_record/reflection.rb:221:in `klass'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:33:in `block (2 levels) in reflections'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:27:in `tap'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:27:in `block in reflections'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:26:in `collect'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:26:in `reflections'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/joiner-0.3.4/lib/joiner/path.rb:17:in `model'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/column_sql_presenter.rb:32:in `exists?'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/column_sql_presenter.rb:14:in `with_table'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/property_sql_presenter.rb:60:in `collect'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/property_sql_presenter.rb:60:in `columns_with_table'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/property_sql_presenter.rb:41:in `casted_column_with_table'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/property_sql_presenter.rb:17:in `to_select'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:68:in `collect'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:68:in `presenters_to_select'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:115:in `select_clause'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:82:in `scope_by_select'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:47:in `filter_by_scopes'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder/statement.rb:12:in `to_relation'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_builder.rb:11:in `sql_query'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:119:in `build_sql_query'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:135:in `prepare_for_render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/active_record/sql_source.rb:65:in `render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration/index.rb:29:in `block in render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration/index.rb:29:in `collect'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration/index.rb:29:in `render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/core/index.rb:57:in `render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration.rb:43:in `block in render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration.rb:43:in `collect'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/riddle-1.5.12/lib/riddle/configuration.rb:43:in `render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/configuration.rb:93:in `render'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/configuration.rb:99:in `block in render_to_file'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/open-uri.rb:36:in `open'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/open-uri.rb:36:in `open'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/configuration.rb:99:in `render_to_file'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/rake_interface.rb:24:in `configure'
/Users/mike/.rvm/gems/ruby-2.2.2/gems/thinking-sphinx-3.1.4/lib/thinking_sphinx/tasks.rb:4:in `block (2 levels) in <top (required)>'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:240:in `call'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:240:in `block in execute'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:235:in `each'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:235:in `execute'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:179:in `block in invoke_with_call_chain'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:172:in `invoke_with_call_chain'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb:165:in `invoke'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:150:in `invoke_task'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:106:in `each'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:106:in `block in top_level'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:115:in `run_with_threads'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:100:in `top_level'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:78:in `block in run'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling'
/Users/mike/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/application.rb:75:in `run'
/Users/mike/.rvm/rubies/ruby-2.2.2/bin/rake:33:in `<main>'
pat commented 9 years ago

Hi Mike

Looks like it's the comma in your list of polymorph types that's screwing things up. Try this instead:

polymorphs working_location, to: %w(Location Facility)
mikemerritt commented 9 years ago

@pat Oh geez, how did I miss that! Thanks!

pat commented 9 years ago

Sometimes it's the small things :) Presume it's working fine now?

mikemerritt commented 9 years ago

@pat Yup, thanks!