如何设置续集模型中的默认值?

6 ruby default model sequel

给定下面的代码,如何为模型定义默认值.(比方说,默认为: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}>]
Run Code Online (Sandbox Code Playgroud)

所以,我想将第二个创建的Item设置为#<Item @values = {:name =>"Thing",:id => 2}>而不是:name => nil.

Jer*_*ans 7

Subba的答案是在Sequel中推荐的方法.它将默认值推送到数据库中.

如果您想在模型中而不是在数据库中使用默认值,我建议使用before_createafter_initialize钩子来执行它们:

class Item < Sequel::Model
  def before_create # or after_initialize
    super
    self.name ||= 'Thing'
  end
end
Run Code Online (Sandbox Code Playgroud)

after_initialize和之间的区别在于before_create它们被调用. before_create建议使用,因为它不会在INSERT调用数据库方法之前设置默认值.但是,如果你想:

Item.new.name == 'Thing'
Run Code Online (Sandbox Code Playgroud)

然后你必须使用after_initialize.


Sub*_*Rao 4

DB.create_table :items do
        primary_key :id
        String :name,:default => 'Thing'
end
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩

来自续集Sequel ::数据库源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
Run Code Online (Sandbox Code Playgroud)

里面Schema :: Generator类method_missing句柄String,text,boolean,number由列方法处理

def method_missing(type, name = nil, opts = {})
     name ? column(name, type, opts) : super
end
Run Code Online (Sandbox Code Playgroud)

有关其他选项,请参阅续集专栏