pat / thinking-sphinx

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

ThinkingSphinx::Test.start with Rails 6.1: undefined method `[]' for nil:NilClass #1231

Closed lesliev closed 2 years ago

lesliev commented 2 years ago

Hi!

I'm busy upgrading from Rails 5.2.8.1 to 6.1.6.1 and the call to ThinkingSphinx::Test.start in my spec/support/sphinx.rb is raising an error on Rails 6. It was working fine on Rails 5.

It ultimately comes down to association_for(path).tables being nil over here, but I don't know enough about these internals to understand where this tables array gets set up and why it might be nil:

From: /home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/joiner-0.4.2/lib/joiner/joins.rb:25 Joiner::Joins#alias_for:

    18: def alias_for(path)
    19:   return model.table_name if path.empty?
    20: 
    21:   add_join_to path
    22:   begin
    23:   association_for(path).tables.first.name
    24:   rescue => e
 => 25:     require 'pry'; binding.pry
    26:   end
    27: end

association_for(path) looks like this:

[3] pry(#<Joiner::Joins>)> association_for(path)
=> #<ActiveRecord::Associations::JoinDependency::JoinAssociation:0x000055cc0b188260
 @base_klass=
  Person(id: integer, name: string, discogs_link: string, created_by_id: string, stub_content: text, created_at: datetime, updated_at: datetime, featured: boolean, parent_id: integer, aliases: string, stub_intro: text, viewable: boolean, published_date: datetime, hide_from_content_queue: boolean, slug: string, stub_bio_author: string, context: string, short_url: string, delta: boolean, first_published_date: datetime, updated_date: datetime, gender: text),
 @children=[],
 @reflection=
  #<ActiveRecord::Reflection::ThroughReflection:0x000055cc0ab8fcf0
   @class_name="Person",
   @delegate_reflection=
    #<ActiveRecord::Reflection::HasManyReflection:0x000055cc0ab8ff20
     @active_record=
      Image(id: integer, file: string, credit: string, created_at: datetime, updated_at: datetime, description: text, rights_owner: string, tags: text, thumb_width: integer, thumb_height: integer, hero_thumb_width: integer, hero_thumb_height: integer, delta: boolean),
     @constructable=true,
     @inverse_name=nil,
     @klass=nil,
     @name=:imageables,
     @options={:through=>:imageable_images, :source=>:imageable, :source_type=>"Person"},
     @plural_name="imageables",
     @scope=nil>,
   @klass=
    Person(id: integer, name: string, discogs_link: string, created_by_id: string, stub_content: text, created_at: datetime, updated_at: datetime, featured: boolean, parent_id: integer, aliases: string, stub_intro: text, viewable: boolean, published_date: datetime, hide_from_content_queue: boolean, slug: string, stub_bio_author: string, context: string, short_url: string, delta: boolean, first_published_date: datetime, updated_date: datetime, gender: text),
   @source_reflection_name=:imageable>>

The complete backtrace to the error is:

/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/joiner-0.4.2/lib/joiner/joins.rb:22:in `alias_for'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/column_sql_presenter.rb:48:in `table'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/column_sql_presenter.rb:34:in `escape_table?'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/column_sql_presenter.rb:18:in `with_table'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/property_sql_presenter.rb:62:in `collect'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/property_sql_presenter.rb:62:in `columns_with_table'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/property_sql_presenter.rb:43:in `casted_column_with_table'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/property_sql_presenter.rb:19:in `to_select'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:70:in `collect'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:70:in `presenters_to_select'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:117:in `select_clause'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:84:in `scope_by_select'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:49:in `filter_by_scopes'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder/statement.rb:14:in `to_relation'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_builder.rb:13:in `sql_query'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_source.rb:140:in `build_sql_query'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_source.rb:165:in `prepare_for_render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/active_record/sql_source.rb:83:in `render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration/index.rb:30:in `block in render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration/index.rb:30:in `collect'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration/index.rb:30:in `render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/core/index.rb:74:in `render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration.rb:45:in `block in render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration.rb:45:in `collect'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/riddle-2.4.3/lib/riddle/configuration.rb:45:in `render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/configuration.rb:111:in `render'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/configuration.rb:119:in `block in render_to_file'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/open-uri.rb:21:in `open'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/open-uri.rb:21:in `open'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/configuration.rb:119:in `render_to_file'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/thinking-sphinx-5.4.0/lib/thinking_sphinx/test.rb:10:in `start'
/home/leslie/dev/git/hb/audioculture/spec/support/sphinx.rb:22:in `block (2 levels) in <main>'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:457:in `instance_exec'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:457:in `instance_exec'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:365:in `run'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2155:in `block in run_suite_hooks'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2153:in `each'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2153:in `run_suite_hooks'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2067:in `with_suite_hooks'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb:74:in `report'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:115:in `run_specs'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:89:in `run'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:71:in `run'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:45:in `invoke'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/rspec-core-3.11.0/exe/rspec:4:in `<top (required)>'
/home/leslie/.rbenv/versions/2.7.5/bin/rspec:23:in `load'
/home/leslie/.rbenv/versions/2.7.5/bin/rspec:23:in `<top (required)>'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli/exec.rb:63:in `load'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli/exec.rb:63:in `kernel_load'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli/exec.rb:28:in `run'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli.rb:476:in `exec'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli.rb:30:in `dispatch'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/cli.rb:24:in `start'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/libexec/bundle:46:in `block in <top (required)>'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/2.7.0/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/home/leslie/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/libexec/bundle:34:in `<top (required)>'
/home/leslie/.rbenv/versions/2.7.5/bin/bundle:23:in `load'
/home/leslie/.rbenv/versions/2.7.5/bin/bundle:23:in `<main>'

Please let me know if there's any other way I can help you to help me to figure this out!

pat commented 2 years ago

Hi Leslie :) I agree that the internals of ActiveRecord + Joiner are hard to get one's head around - it's a big part of why I extracted the logic from TS into Joiner instead, so it's at least more focused.

It also means that I can update Joiner for newer ActiveRecord releases without needing to change TS - and I think that could help in this case. Can you try bundle update joiner - which should take you to 0.6.0 - and see if that helps matters?

lesliev commented 2 years ago

Yes, works perfectly! Thanks so much!

pat commented 2 years ago

Wonderful :)