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

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

4

3 回答 3

7

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

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

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 source 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 回答
2

我可以使用defaults_setter设置默认值。

适用于所有型号。(在定义想要使用 default_setter 的子类之前调用​​它)

Sequel::Model.plugin :defaults_setter

仅适用于特定型号。

Item.plugin :defaults_setter

或者

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

您可以像这样设置默认值。

Item.default_values[:name] = 'foobar'

谢谢你。

于 2017-09-21T08:25:27.687 回答