Ruby 模型:像create_table这样的方法来自哪里?

Ruby 模型:像create_table这样的方法来自哪里?,ruby,sequel,Ruby,Sequel,我试图了解续集是如何工作的。下面的示例继承自Sequel::Model,并调用set_schema、create_table等 我试图找到这些方法的文档,但在Sequel::Model的rdoc上没有找到任何运气: 这些方法来自哪里?Sequel::Model是如何使它们可用的 class Task < Sequel::Model set_schema do primary_key :id varchar :title, :unique => true, :em

我试图了解续集是如何工作的。下面的示例继承自Sequel::Model,并调用set_schema、create_table等

我试图找到这些方法的文档,但在Sequel::Model的rdoc上没有找到任何运气:

这些方法来自哪里?Sequel::Model是如何使它们可用的

class Task < Sequel::Model
  set_schema do
    primary_key :id

    varchar :title, :unique => true, :empty => false
    boolean :done, :default => false
  end

  create_table unless table_exists?

  if empty?
    create :title => 'Laundry'
    create :title => 'Wash dishes'
  end
end
类任务true,:empty=>false
布尔值:完成,:默认值=>false
结束
创建表格,除非表格存在?
如果是空的?
创建:标题=>“洗衣房”
创建:标题=>“洗碗”
结束
结束

它们在
Sequel::Plugins::Schema::ClassMethods
(lib/Sequel/Plugins/Schema.rb)中定义,并在模型中调用
plugin:Schema
时包含在内

问题中的示例不完整,除非建立到数据库的连接并从模型中调用
plugin:schema
,否则将无法工作

 irb(main):001:0> require "rubygems"
 => true
 irb(main):002:0> require "sequel"
 => true
 irb(main):003:0> 
 irb(main):004:0*   # connect to an in-memory database
 irb(main):005:0*   DB = Sequel.sqlite
 => #<Sequel::SQLite::Database: "sqlite:/">
 irb(main):006:0> class Task < Sequel::Model
 irb(main):007:1>     set_schema do
 irb(main):008:2*           primary_key :id
 irb(main):009:2>     
 irb(main):010:2*           varchar :title, :unique => true, :empty => false
 irb(main):011:2>         boolean :done, :default => false
 irb(main):012:2>       end
 irb(main):013:1>   
 irb(main):014:1*       create_table unless table_exists?
 irb(main):015:1>   
 irb(main):016:1*       if empty?
 irb(main):017:2>         create :title => 'Laundry'
 irb(main):018:2>         create :title => 'Wash dishes'
 irb(main):019:2>       end
 irb(main):020:1>   end
 NoMethodError: undefined method `set_schema' for Task:Class
   from (irb):7
 irb(main):021:0> class Task < Sequel::Model
 irb(main):022:1>   plugin :schema
 irb(main):023:1>     set_schema do
 irb(main):024:2*           primary_key :id
 irb(main):025:2>     
 irb(main):026:2*           varchar :title, :unique => true, :empty => false
 irb(main):027:2>         boolean :done, :default => false
 irb(main):028:2>       end
 irb(main):029:1>   
 irb(main):030:1*       create_table unless table_exists?
 irb(main):031:1>   
 irb(main):032:1*       if empty?
 irb(main):033:2>         create :title => 'Laundry'
 irb(main):034:2>         create :title => 'Wash dishes'
 irb(main):035:2>       end
 irb(main):036:1>   end
 => #<Task @values={:title=>"Wash dishes", :done=>false, :id=>2}>
 irb(main):037:0> 
irb(main):001:0>需要“rubygems”
=>正确
irb(主):002:0>要求“续集”
=>正确
irb(主要):003:0>
irb(主):004:0*#连接到内存中的数据库
irb(主):005:0*DB=Sequel.sqlite
=> #
irb(main):006:0>类任务设置模式do
irb(主):008:2*主键:id
irb(主要):009:2>
irb(main):010:2*varchar:title,:unique=>true,:empty=>false
irb(main):011:2>boolean:done,:default=>false
irb(主):012:2>结束
irb(主要):013:1>
irb(主):014:1*创建表格,除非表格存在?
irb(主要):015:1>
irb(主):016:1*如果为空?
irb(主):017:2>创建:标题=>“洗衣房”
irb(主):018:2>创建:标题=>“洗碗碟”
irb(主):019:2>结束
irb(主):020:1>结束
NoMethodError:任务类的未定义方法“set_schema”
来自(irb):7
irb(主):021:0>类任务插件:模式
irb(主):023:1>设置模式do
irb(主):024:2*主键:id
irb(主要):025:2>
irb(main):026:2*varchar:title,:unique=>true,:empty=>false
irb(main):027:2>boolean:done,:default=>false
irb(主):028:2>结束
irb(主要):029:1>
irb(主):030:1*创建表格,除非表格存在?
irb(主要):031:1>
irb(主):032:1*如果为空?
irb(主):033:2>创建:标题=>“洗衣房”
irb(主):034:2>创建:标题=>“洗碗碟”
irb(主):035:2>结束
irb(主):036:1>结束
=>#“洗碗碟”,:done=>false,:id=>2}>
irb(主要):037:0>

谁在调用plugin:schema?超类?我的示例模型没有调用它…@Sergio-我认为您需要在您的模型中调用
plugin:schema
,并且您的示例不完整,无法按编码方式工作。通过使用Schema插件的方法扩展模型,将这一行添加到示例中可以使其正常工作。我已经用一个irb会议编辑了我的上述答案,演示了这一点。@Sergio-如果你的例子确实有效,那么你可能正在使用另一个版本的Sequel。我的答案是指3.6.0版,我认为它是最新的(在撰写本文时)