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:10:in `'から#(NoMethodError)のtest.rb:5:in connect': undefined methodado'

なぜadoメソッドが表示されないのですか?

4

2 に答える 2

2

ルビーでは、クラスをサブクラス化すると、スーパークラスのシングルトンメソッドをサブクラスのシングルトンメソッドとして呼び出すことで呼び出すことができますが、インクルード/拡張モジュールでは機能しません。これは、モジュールがメソッドルックアップの点でクラスと異なる1つの方法です。その理由を理解するには、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

何が起こっているのかというと、Sequelが含まれているので、そのメソッドはインスタンスメソッドとして利用できます。つまり、拡張したいと思います。

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 に答える