我正在尝试在我的应用中集成名为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不起作用
任何人都有线索
答案 0 :(得分:0)
似乎这是gem的一个bug。您可以看到讨论here。
有两种方法可以解决它。
如果您正在使用query_reviewer
gem,请尝试禁用它。
如果上述步骤不起作用。自己修复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。
仅供参考:您的帖子中的错误指向database_statements.rb:11
,但我发现source的代码位于第8行。无法找到确切的版本你的。