Ruby on rails 3.2 ruby 1.8.7和2.1之间的DBI行/委托行为

Ruby on rails 3.2 ruby 1.8.7和2.1之间的DBI行/委托行为,ruby-on-rails-3.2,ruby-1.8.7,ruby-2.1,ruby-1.8,Ruby On Rails 3.2,Ruby 1.8.7,Ruby 2.1,Ruby 1.8,我在ruby 1.8.7中执行以下代码以从数据库中读取行: require 'dbi' db_conn_handle = DBI.connect("DBI:Mysql:host=localhost;database=mydb;port=3306", "root") sth = db_conn_handle.prepare("select accounts.id, accounts.name from accounts;") sth.execute info = sth.to_a puts "In

我在ruby 1.8.7中执行以下代码以从数据库中读取行:

require 'dbi'
db_conn_handle = DBI.connect("DBI:Mysql:host=localhost;database=mydb;port=3306", "root")
sth = db_conn_handle.prepare("select accounts.id, accounts.name from accounts;")
sth.execute
info = sth.to_a
puts "Info: #{info[0].class}"
info.each do |x, y|
  puts "#{x} ... #{y}"
end
从输出中可以清楚地看到info[0]。类是DBI::Row。当使用ruby 1.8.7(rails 3.2.17)执行此代码时,它可以完美地工作

当我尝试在ruby 2.1.5/rails 3.2.17中执行它时,会出现以下错误:

/home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:392:in `__getobj__': not delegated (ArgumentError)
    from /home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:341:in `block in delegating_block'
    from /home/rjain/mac/query.rb:7:in `each'
    from /home/rjain/mac/query.rb:7:in `<top (required)>'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in `eval'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in `<top (required)>'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in `require'
    from /home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
/home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:392:in`u_ugetobj_uu_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u
from/home/rjain/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/delegate.rb:341:in“block in delegate_block”
from/home/rjain/mac/query.rb:7:在'each'中
from/home/rjain/mac/query.rb:7:in`'
from/home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in'eval'
from/home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands/runner.rb:52:in`'
from/home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in'require'
from/home/rjain/.rvm/gems/ruby-2.1.5/gems/railties-3.2.17/lib/rails/commands.rb:64:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'

文件/home/rjain/mac/query.rb粘贴在上面。我想了解ruby 2.1和1.8之间的差异是什么导致了这个问题。此问题的解决方案是什么?

遇到了相同的问题,并跟踪了该问题

在gem目录中找到lib/dbi/row.rb。第212行或其附近应为

        if RUBY_VERSION =~ /^1\.9/
编辑成

        if RUBY_VERSION =~ /^1\.9/ || RUBY_VERSION =~ /^2/

这也是用Ruby 1.8x编写的代码在2.1.0中运行时出现的问题 /usr/lib/ruby/2.1.0/delegate.rb:392:in
\uuuuu getobj\uuuuuuuuuu':未委托(ArgumentError)
from/usr/lib/ruby/2.1.0/delegate.rb:341:in
block in deleging_block'

找到上面的jsc注释后,我们修改了DBIGEM文件夹中的row.rb文件。再次,寻找以下部分:

 if RUBY_VERSION =~ /^1\.9/
并将其更新为

如果RUBY_版本=~/^1\.9/| | RUBY_版本=~/^2/


在那之后,应用程序运行没有问题。

是否有人需要通过分叉dbi来合并此更改?