Ruby 模型:像create_table这样的方法来自哪里?
我试图了解续集是如何工作的。下面的示例继承自Sequel::Model,并调用set_schema、create_table等 我试图找到这些方法的文档,但在Sequel::Model的rdoc上没有找到任何运气: 这些方法来自哪里?Sequel::Model是如何使它们可用的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
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版,我认为它是最新的(在撰写本文时)