Расширение Ruby Sequel

Я пытаюсь создать библиотеку, которая будет обрабатывать соединения с базой данных, расширяя объект/модуль 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?


person metrix    schedule 24.08.2012    source источник
comment
Был ли адаптер ado, который вы должны были установить?   -  person RadBrad    schedule 25.08.2012
comment
нет, Sequel.ado(‹blah›) работает нормально.   -  person metrix    schedule 25.08.2012


Ответы (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.

person Jeremy Evans    schedule 25.08.2012

Что происходит, так это то, что 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()
person RadBrad    schedule 24.08.2012
comment
Это не работает, так как расширение модуля только добавляет методы экземпляра модуля в качестве методов класса, а не делает одноэлементные методы модуля доступными для класса. - person Jeremy Evans; 25.08.2012