1

我正在尝试通过扩展 Sequel 对象/模块来创建一个处理数据库连接的库。但我无法通过这个:

require 'sequel'
class Database 
  include Sequel
  def connect()
    self.ado(:conn_string=>"Server=homeServer;Provider=SQLNCLI10;Database=test;Trusted_Connection=yes;")
  end
end
db = LocalDatabase.new()
db.connect()

我收到以下错误:test.rb:5:in connect': undefined methodado' for # (NoMethodError) from test.rb:10:in `'

为什么我看不到ado方法?

4

2 回答 2

2

在 ruby​​ 中,如果您对一个类进行子类化,则可以通过将它们作为子类的单例方法调用来调用超类的单例方法,但这不适用于包含/扩展模块。这是模块在方法查找方面与类不同的一种方式。要了解原因,您需要阅读有关 ruby​​ 的方法查找和对象模型如何工作的详细信息。

要调用 Sequel 模块的单例方法,您需要使用显式接收器调用它们:

require 'sequel'
class Database 
  include Sequel
  def connect()
    Sequel.ado(:conn_string=>"Server=homeServer;Provider=SQLNCLI10;Database=test;Trusted_Connection=yes;")
  end
end
db = LocalDatabase.new()
db.connect()

FWIW,除了只读工作负载,我不建议使用 ado 适配器。由于您似乎正在连接到 SQL Server,因此我建议使用 tinytds 适配器。

于 2012-08-25T00:19:43.823 回答
-1

发生的事情是包含续集,因此它的方法可用作实例方法,我认为您想扩展,即

require 'sequel'
class Database 
  extend Sequel
  def connect()
    ado(:conn_string=>
    "Server=homeServer;Provider=SQLNCLI10;Database=test;Trusted_Connection=yes;")
  end
end
db = LocalDatabase.new()
db.connect()
于 2012-08-24T23:59:15.743 回答