rails.parse在rails 4中不被接受

时间:2015-01-20 19:36:44

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

我正在尝试将现有的rails 3项目转换为rails 4。 下面是代码的一部分,它具有Rails 4中不可接受的语法

      sql = [
        "BEGIN #{Card::MY_PACKAGE}.retrieve_card(",
        my_attrs.map { |a| ":#{a}, " }.join,
        ':errormsg); END;'
      ].join

  connection = self.connection.raw_connection
  cursor = connection.parse(sql)

  my_attrs.each { |a| cursor.bind_param(a, my_attrs.send(a)) }

我注意到connection.parse不再适用于Rails 4(我正在使用activerecord-oracle_enhanced-adapter)

我试图完全理解上面代码的作用(我没写过)

rails 4中的等效语法是什么?

cursor = ActiveRecord::Base.connection.execute(sql) //Something along these lines?

编辑:

我明白了:

 `"DEPRECATION WARNING: #connection is deprecated in favour of accessing it via the class."` //when i try to puts self.connection.class

1 个答案:

答案 0 :(得分:2)

  

我正在努力完全克服上述代码所做的事情(我没有   写吧)

module Card  #Creates a namespace called Card
  MY_PACKAGE = "hello"
end

str1 = "BEGIN #{Card::MY_PACKAGE}.retrieve_card("  #Looks in a namespace called Card for the constant MY_PACKAGE
puts str1  #=> "BEGIN hello.retrieve_card("

my_attrs = ['dog', 'cat', 'squirrel']
arr = my_attrs.map { |a| ":#{a}, " }
p arr      #=> [":dog, ", ":cat, ", ":squirrel, "]
str2 = arr.join('')
p str2  #=> ":dog, :cat, :squirrel,"

str3 = ':errormsg); END;'
p str3  #=> ":errormsg); END;"

array_of_strs = [str1, str2, str3]

sql_statement = array_of_strs.join('')
p sql_statement  #=> "BEGIN hello.retrieve_card(:dog, :cat, :squirrel, :errormsg); END;"

加入(隔膜= $)
返回通过将数组的每个元素转换为字符串而创建的字符串,由给定的分隔符分隔。如果分隔符为nil,则使用当前$,。如果separator和$都是nil,则使用空字符串。

http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-join

  

rails 4中的等效语法是什么?

对我来说,看起来raw_connection应该能够调用parse(),请参见第98,107行:

https://github.com/rsim/oracle-enhanced/blob/8c1335658a864f93fe1e6b22a512d281677ee170/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb

该页面上的类继承自:

class OracleEnhancedOCIConnection < OracleEnhancedConnection

...而且OracleEnhancedConnection类有@raw_connection的属性读取器,请参见第17行:

https://github.com/rsim/oracle-enhanced/blob/8c1335658a864f93fe1e6b22a512d281677ee170/lib/active_record/connection_adapters/oracle_enhanced_connection.rb

是self.connection.raw_connection返回的raw_connection吗?尝试:

puts self.connection.class
  

puts self.class.connection.raw_connection.class返回:OCI8EnhancedAutoRecover&#34;

此处定义了OCI8EnhancedAutoRecover类:

https://github.com/rsim/oracle-enhanced/blob/8c1335658a864f93fe1e6b22a512d281677ee170/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb

...像这样:

class OCI8EnhancedAutoRecover < DelegateClass(OCI8)

OCI8EnhancedAutoRecover类定义了一些方法 - 没有一个是parse() - 并且委托给OCI8类的其他方法调用 - 这是< DelegateClass(OCI8)的含义。

OCI8课程由:

提供
require "oci8"

...需要ruby-oci8 gem。那个gem在这里定义了OCI8类:

https://github.com/kubo/ruby-oci8/blob/master/lib/oci8/oci8.rb

在第168行,它定义了一个parse()方法:

  def parse(sql)
    @last_error = nil
    parse_internal(sql)
  end

所以在raw_connection上调用parse()应该可以工作。

相关问题