我正在尝试将现有的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
答案 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行:
该页面上的类继承自:
class OracleEnhancedOCIConnection < OracleEnhancedConnection
...而且OracleEnhancedConnection类有@raw_connection的属性读取器,请参见第17行:
是self.connection.raw_connection返回的raw_connection吗?尝试:
puts self.connection.class
puts self.class.connection.raw_connection.class返回:OCI8EnhancedAutoRecover&#34;
此处定义了OCI8EnhancedAutoRecover
类:
...像这样:
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()应该可以工作。