activerecord_any_of icon indicating copy to clipboard operation
activerecord_any_of copied to clipboard

undefined method `reverse' for nil:NilClass

Open ajoulie opened this issue 12 years ago • 2 comments

To reproduce

Create a rails app with this gist : https://gist.github.com/ajoulie/df84134d49a9b8c7785a

Create an author and run scope on console

a = Author.create(name: 'the_name')
a.post.test

Stack shows

NoMethodError: undefined method `reverse' for nil:NilClass
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:28:in `block in to_sql'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/bind_visitor.rb:31:in `call'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/bind_visitor.rb:31:in `visit_Arel_Nodes_BindParam'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/visitor.rb:28:in `visit'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/to_sql.rb:524:in `visit_Arel_Nodes_Equality'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/visitor.rb:28:in `visit'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/to_sql.rb:505:in `block in visit_Arel_Nodes_And'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/to_sql.rb:505:in `map'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/to_sql.rb:505:in `visit_Arel_Nodes_And'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/visitor.rb:28:in `visit'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/visitor.rb:8:in `accept'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/visitors/bind_visitor.rb:16:in `accept'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/arel-4.0.2/lib/arel/nodes/node.rb:45:in `to_sql'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord_any_of-1.2/lib/activerecord_any_of/alternative_builder.rb:83:in `with_statement_cache'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord_any_of-1.2/lib/activerecord_any_of/alternative_builder.rb:29:in `build'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord_any_of-1.2/lib/activerecord_any_of/alternative_builder.rb:12:in `build'
... 2 levels...
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-deprecated_finders-1.0.3/lib/active_record/deprecated_finders/base.rb:28:in `call'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-deprecated_finders-1.0.3/lib/active_record/deprecated_finders/base.rb:28:in `call'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/scoping/named.rb:163:in `block (2 levels) in scope'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/relation.rb:270:in `scoping'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/scoping/named.rb:163:in `block in scope'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/relation/delegation.rb:36:in `block in test'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/associations/collection_proxy.rb:845:in `block in scoping'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/relation.rb:270:in `scoping'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/associations/collection_proxy.rb:845:in `scoping'
    from /Users/antoinejoulie/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/relation/delegation.rb:36:in `test'

A (quick?) fix Use

ActiveRecord::ConnectionAdapters::AbstractAdapter#without_prepared_statement? 

to decide wether or not use prepared_statements, instead of

ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_statement_cache? 

on line 24 of lib/activerecord_any_of/alternative_builder.rb

Problem: this methods is protected.

ajoulie avatar Apr 17 '14 13:04 ajoulie

Hello @ajoulie,

Thanks for pointing this out.

I've already had problems with prepared statements, #without_prepared_statement won't help because statements are already prepared when reaching #any_of.

Actually, if it's related to prepared statements and bind values, it may already be solved in branch fix_prepared_statement. Could you try it by any chance, to see if it's the same problem ?

oelmekki avatar Apr 18 '14 12:04 oelmekki

Hi, I tried on the commit 8c0d51192c2c. Exact same problem, exact same trace.

ajoulie avatar Apr 19 '14 08:04 ajoulie