2009-11-25 74 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