2012-08-24 102 views
1

我试图做出会通过延长续集对象/模块处理数据库连接一个库。但我一直没能获得通过这样的:扩展红宝石续集

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:connect': undefined method ADO '从test.rb#(NoMethodError):10:`'

为什么我不能看到ADO方法?

+0

是否有你应该安装一个ADO适配器? – RadBrad

+0

不,Sequel.ado()工作得很好。 – metrix

回答

2

在Ruby中,如果你继承一个类时,你可以调用超类的单例方法通过将它们作为子类的单例方法调用,但这对于包含/扩展模块不起作用。这是模块在方法查找方面与类不同的一种方法。为了理解为什么,你需要阅读ruby的方法查找和对象模型如何工作的细节。

要调用的续集模块的特殊方法,你需要给他们打电话有明确的接收器:

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,我不推荐使用除只读工作负载结结实实适配器。由于您似乎正在连接到SQL Server,因此我建议使用tinytds适配器。

-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() 
+0

这不起作用,因为扩展模块只增加了模块的实例方法为类方法,它不会使模块的特殊方法提供给类。 –