to_sql on arel每次都不起作用

时间:2014-09-16 12:48:42

标签: ruby-on-rails ruby-on-rails-3 activerecord arel

我正在尝试在我的应用中集成名为slim_scrooge的gem,但我不断遇到一些奇怪的问题,即收到以下错误

NoMethodError:to_sql'中未定义的方法reverse' for nil:NilClass from /Users/ratatouille/.rvm/gems/ruby-1.9.3-p547@minerva/gems/activerecord-3.2.10/lib/active_record/connection_adapters/abstract/database_statements.rb:11:in阻止

仔细调试后,我发现错误是在arel上的.to_sql上生成错误。

要找到我在此line

上添加断点的原因

然后我发现了这个

##首次运行

  

Performer.find(1985)

 From: /Users/Ratatouille/.rvm/gems/ruby-1.9.3-p547@minerva/gems/activerecord-3.2.10/lib/active_record/relation.rb @ line 171 ActiveRecord::Relation#exec_queries:

    166: 
    167:       default_scoped = with_default_scope
    168: 
    169:       if default_scoped.equal?(self)
    170:         @records = if @readonly_value.nil? && !@klass.locking_enabled?
 => 171:           binding.pry
    172:           eager_loading? ? find_with_associations : @klass.find_by_sql(arel, @bind_values)
    173:         else
    174:           IdentityMap.without do
    175:             eager_loading? ? find_with_associations : @klass.find_by_sql(arel, @bind_values)
    176:           end

[1] pry(#<ActiveRecord::Relation>)> arel.to_sql
=> "SELECT  `performers`.* FROM `performers`  WHERE `performers`.`id` = ? LIMIT 1"

##第二次运行同一记录

  

Performer.find(1985)

From: /Users/ratatouille/.rvm/gems/ruby-1.9.3-p547@minerva/gems/activerecord-3.2.10/lib/active_record/relation.rb @ line 171 ActiveRecord::Relation#exec_queries:

    166: 
    167:       default_scoped = with_default_scope
    168: 
    169:       if default_scoped.equal?(self)
    170:         @records = if @readonly_value.nil? && !@klass.locking_enabled?
 => 171:           binding.pry
    172:           eager_loading? ? find_with_associations : @klass.find_by_sql(arel, @bind_values)
    173:         else
    174:           IdentityMap.without do
    175:             eager_loading? ? find_with_associations : @klass.find_by_sql(arel, @bind_values)
    176:           end

[1] pry(#<ActiveRecord::Relation>)> arel.to_sql
NoMethodError: undefined method `reverse' for nil:NilClass
from /Users/ratatouille/.rvm/gems/ruby-1.9.3-p547@minerva/gems/activerecord-3.2.10/lib/active_record/connection_adapters/abstract/database_statements.rb:11:in `block in to_sql'

我要坚持以下事实:为什么第二次使用arel.to_sql不起作用

任何人都有线索

更多信息 -

  • Rails 3.2.10

1 个答案:

答案 0 :(得分:0)

似乎这是gem的一个bug。您可以看到讨论here

有两种方法可以解决它。

  1. 如果您正在使用query_reviewer gem,请尝试禁用它。

  2. 如果上述步骤不起作用。自己修复active_record错误。

    ## rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb
    
    def to_sql(arel, binds = [])
      if arel.respond_to?(:ast)
        visitor.accept(arel.ast) do
          quote(*binds.shift.reverse) # root cause for the bug
        end
      else
       arel
      end
    end
    

    binds变量的默认参数在这里是错误的。改变它

    def to_sql(arel, binds = [[]]) # Added an empty array
    

    检查here如何覆盖rails模块方法(简单方法)。或者您可以将您的宝石部署到本地文件夹并覆盖它们(艰难地),例如检查answer

  3. 仅供参考:您的帖子中的错误指向database_statements.rb:11,但我发现source的代码位于第8行。无法找到确切的版本你的。