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