7

以下のコードを考えると、モデルのデフォルト値をどのように定義できますか。(:name のデフォルトは 'Thing' であるとしましょう)。

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}>]

したがって、2 番目に作成されたアイテムを :name=>nil ではなく #<Item @values={:name=>"Thing", :id=>2}> に設定したいと思います。

4

3 に答える 3

7

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

データベースではなくモデルにデフォルトを設定する場合は、before_createまたはafter_initializeフックを使用してデフォルトを設定することをお勧めします。

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

after_initializeとの違いbefore_createは、それらが呼び出されるときです。 データベースメソッドが呼び出されるbefore_create直前までデフォルトが設定されないため、をお勧めします。INSERTただし、必要に応じて:

Item.new.name == 'Thing'

次に、を使用する必要がありますafter_initialize

于 2009-08-04T21:30:55.453 に答える
4
DB.create_table :items do
        primary_key :id
        String :name,:default => 'Thing'
end

トリックを行う必要があります

続編の Sequel::Database ソースから create_table ブロックは Schema::Generator 内で評価されます

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

内部 Schema::Generator クラス method_missing を処理します String、text、boolean、number は column メソッドによって処理されます

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

追加オプションについては、後続のコラムを参照してください

于 2009-07-20T14:47:48.540 に答える