0

我试图转换现有轨道3项目,轨道4 这里是一个具有语法部分的代码,是不是在轨道4,5connection.parse在轨不接受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不再与轨道4工作

我想完全comphrend上面的代码做什么(我没有写它)

会是什么(我用ActiveRecord-oracle_enhanced适配器工作)成为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 

回答

2

我试图完全补偿[重新] hrend上面的代码做什么(我没 写)

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;" 

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

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

什么是在轨道4,5相当于语法?

对我来说,它看起来像一个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 

放self.class.connection.raw_connection.class回报:OCI8EnhancedAutoRecover”

OCI8EnhancedAutoRecover类定义如下:

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

...像这样:

class OCI8EnhancedAutoRecover < DelegateClass(OCI8) 

OCI8EnhancedAutoRecover类定义了一些方法 - 其中没有一个是解析() - 和代表其他方法调用的OCI8类 - 这就是< DelegateClass(OCI8)手段。

require "oci8" 

...这需要ruby-oci8 gem

的OCI8类由提供。创业板在这里定义的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应该工作。

+0

我得到这个“拒绝警告:#连接已弃用,有利于通过类访问它。”当我尝试把self.connection.class – Micheal 2015-01-20 21:33:40

+0

@Micheal,然后:'puts self.class.connection.class' – 7stud 2015-01-20 21:39:10

+0

你是对的。返回给我一个'ActiveRecord :: ConnectionAdapters :: OracleEnhancedAdapter' – Micheal 2015-01-20 21:42:32