2009-07-19 25 views
4

以下のコードを与えると、モデルに対してどのようにデフォルト値を定義できますか。 (名前のデフォルトは「Thing」とします)。 {:名前=> "シング"、:ID => 2} >のではなく:名=> nilのSequelモデルのデフォルト値はどのように設定できますか?

require 'pp' 
require 'sequel' 


DB = Sequel.sqlite 

DB.create_table :items do 
    primary_key :id 
    String :name 
end 

items = DB[ :items ] 


class Item < Sequel::Model 

end 

Item.create :name => 'foobar' 
Item.create 

pp Item.all 
# => 
# >> [#<Item @values={:name=>"foobar", :id=>1}>, 
# >> #<Item @values={:name=>nil, :id=>2}>] 

だから、私は#<項目@valuesへ=秒作成されたアイテムを設定したいのですが。

答えて

5
DB.create_table :items do 
     primary_key :id 
     String :name,:default => 'Thing' 
end 

CREATE_TABLEブロックはスキーマ::ジェネレータ内で評価された続編の続編:: Databaseソース

def create_table(name, options={}, &block) 
    options = {:generator=>options} if options.is_a?(Schema::Generator) 
    generator = options[:generator] || Schema::Generator.new(self, &block) 
    create_table_from_generator(name, generator, options) 
    create_table_indexes_from_generator(name, generator, options) 
end 

スキーマ:: Generatorクラスのmethod_missingは、文字列を扱うの内側に、テキストからトリック

を行う必要があります、ブール値、数値は列方法で処理されます

def method_missing(type, name = nil, opts = {}) 
    name ? column(name, type, opts) : super 
end 

o sequel column for additional options

8

サブバの答えがSequelでそれを行うために推奨される方法です。デフォルトをデータベースにプッシュします。

あなたはモデルではなく、データベースにデフォルト値を持つようにしたい場合は、私はそれらを行うためにbefore_createまたはafter_initializeフックを使用することをお勧めします:彼らが呼ばれたときに

class Item < Sequel::Model 
    def before_create # or after_initialize 
    super 
    self.name ||= 'Thing' 
    end 
end 

after_initializebefore_create間の差があります。 INSERTメソッドが呼び出される直前までデフォルトを設定しないため、before_createを推奨します。あなたがしたい場合は、:

Item.new.name == 'Thing' 

は、あなたはafter_initializeを使用する必要があります。

+0

あなたは 'after_create'を意味しますか? 'after_initialize'は、作成時にすべてのモデルインスタンス(データベースから取得された新しいインスタンスとインスタンスの両方)に対して呼び出されるプラグインフックのようです。これは主に旧来の互換性のために存在しますが、まだサポートされています。 http://sequel.jeremyevans.net/rdoc/files/doc/model_hooks_rdoc.htmlを参照してください。 –

0

defaults_setterを使用してデフォルト値を設定できました。

すべてのモデル。 のみ特定のモデルのために

Sequel::Model.plugin :defaults_setter 

(default_setterを使いたいサブクラスを定義する前にこれを呼び出します)。

Item.plugin :defaults_setter 

または

Item class << Sequel::Model 
    plugin :defaults_setter 
end 

次のようなデフォルト値を設定することができます。

Item.default_values[:name] = 'foobar' 

ありがとうございます。

関連する問題