2009-11-25 75 views
1

我想了解Sequel是如何工作的。下面从续集::型号继承例子,并呼吁set_schema,CREATE_TABLE等续集::模型:像create_table这样的方法来自哪里?

我试图找到这些方法的文档,但在对的RDoc续集::型号没有运气:http://sequel.rubyforge.org/rdoc/classes/Sequel/Model.html

在哪里这些方法来自哪里,以及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 

回答

2

他们在Sequel::Plugins::Schema::ClassMethods(LIB /续集/插件/ schema.rb)所定义的,当你在模型中调用plugin :schema包括在内。

http://sequel.rubyforge.org/rdoc-plugins/classes/Sequel/Plugins/Schema/ClassMethods.html#M000110

http://sequel.rubyforge.org/rdoc/classes/Sequel/Model.html#M000130

在问题的例子是不完整的,并且不会工作,除非到数据库的连接设置和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> 
+0

谁在调用plugin:schema?超类?我的示例模型没有调用它... – TraderJoeChicago 2009-11-25 07:21:06

+0

@Sergio - 我相信你需要在你的模型中调用'plugin:schema',并且你的示例是不完整的,不会像编码一样工作。通过将Schema插件的方法扩展为模型,将此行添加到您的示例中可以使其工作。 我已经编辑我的上述答案与irb会议演示这一点。 – samg 2009-11-25 16:11:29

+0

@Sergio - 如果你的例子确实如此,你可能会使用不同版本的续集。我的答案指的是我认为是最新版本的3.6.0版本(撰写本文时)。 – samg 2009-11-25 16:14:37