2009-11-25 3 views
1

후계자가 어떻게 작동하는지 이해하려고합니다. 속편 :: 모델에서 상속 아래의 예와 통화 set_schema, CREATE_TABLE 등Sequel :: Model : 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

누가 플러그인을 호출하고 있습니까? 스키마? 수퍼 클래스? 내 예제 모델이 그것을 호출하지 않습니다 ... – TraderJoeChicago

+0

@Sergio - 나는 당신의 모델에서'plugin : schema'를 호출해야하고, 예제가 불완전한 것으로 믿고 코딩 된 것으로 작동하지 않을 것이라고 생각합니다. 예제에이 행을 추가하면 Schema 플러그인의 메소드를 사용하여 모델을 확장하여 작동하게 할 수 있습니다. 위의 대답을 수정 한 irb 세션으로 편집했습니다. – samg

+0

@Sergio - 예제가 그대로 작동하는 경우 다른 버전의 Sequel을 사용하고있을 가능성이 있습니다. 내 대답은 내가 생각하는 최신 3.6.0 버전을 말합니다 (이 글을 쓰는 시점에서.) – samg

관련 문제