2009-11-25 2 views
1

J'essaie de comprendre comment fonctionne Sequel. L'exemple ci-dessous Hériter de Sequel :: Model et appelle set_schema, create_table, etc.Sequel :: Model: D'où viennent les méthodes comme create_table?

je tentais de trouver la documentation de ces méthodes, mais pas de chance sur le rdoc pour Sequel :: Modèle: http://sequel.rubyforge.org/rdoc/classes/Sequel/Model.html

Où Ces méthodes proviennent-elles de et comment Sequel :: Model les rend-il disponibles?

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 

Répondre

2

Ils sont définis dans Sequel::Plugins::Schema::ClassMethods (lib/suite/plugins/schema.rb) et inclus lorsque vous appelez plugin :schema dans votre modèle.

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

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

L'exemple de la question est incomplète et ne fonctionnera pas à moins qu'une connexion à une base de données est la configuration et l'plugin :schema est appelé à partir du modèle.

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

Qui appelle le plugin: schéma? La superclasse? Mon exemple de modèle ne l'appelle pas ... – TraderJoeChicago

+0

@Sergio - Je crois que vous devez appeler 'plugin: schema' dans votre modèle, et que votre exemple est incomplet et ne fonctionnera pas comme codé. Ajouter cette ligne à votre exemple la fera fonctionner, en étendant votre modèle avec les méthodes du plugin Schema. J'ai modifié ma réponse ci-dessus avec une session IRB la démontrant. – samg

+0

@Sergio - Si votre exemple fonctionne comme il est possible, vous utilisez une version différente de Sequel. Ma réponse fait référence à la version 3.6.0 qui, je crois, est la plus récente (au moment où j'écris ces lignes). – samg

Questions connexes