Ruby 如何设置Sequel模型中的默认值?

Ruby 如何设置Sequel模型中的默认值?,ruby,model,default,sequel,Ruby,Model,Default,Sequel,给定下面的代码,如何为模型定义默认值。 (假设:name的默认值应该是'Thing') require'pp' 需要“续集” DB=Sequel.sqlite DB.create_表:项目不需要 主键:id 字符串:名称 结束 items=DB[:items] 类项foobar Item.create pp项目.全部 # => #>>[#“foobar”,:id=>1}>, #>>#nil,:id=>2}>] 因此,我希望将第二个创建的项设置为#“Thing”,:id=>2}>而不是:nam

给定下面的代码,如何为模型定义默认值。 (假设:name的默认值应该是'Thing')

require'pp'
需要“续集”
DB=Sequel.sqlite
DB.create_表:项目不需要
主键:id
字符串:名称
结束
items=DB[:items]
类项foobar
Item.create
pp项目.全部
# => 
#>>[#“foobar”,:id=>1}>,
#>>#nil,:id=>2}>]
因此,我希望将第二个创建的项设置为#“Thing”,:id=>2}>而不是:name=>nil

DB.create_table :items do
        primary_key :id
        String :name,:default => 'Thing'
end
我们应该这样做

从sequel sequel::数据库源中,在Schema::Generator中计算create_表块

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
内部模式::生成器类方法\缺少句柄字符串、文本、布尔值、数字由列方法处理

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

请参阅《Sequel》中Subba的答案是推荐的方法。它将默认值推送到数据库中

如果您希望在模型中而不是在数据库中设置默认值,我建议在创建之前使用
,或在初始化之后使用
钩子执行这些操作:

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

然后你必须在初始化后使用

我可以使用设置默认值

适用于所有型号。 (在定义要使用默认设置器的子类之前调用此函数)

仅适用于特定型号

Item.plugin :defaults_setter


谢谢。

你的意思是创建后的
after\u initialize
似乎是一个插件挂钩,它“在创建时为所有模型实例(包括新实例和从数据库检索的实例)调用。它的存在主要是为了旧式兼容性,但仍然受支持。”请注意,
after\u initialize
需要一个插件-
Item.new.name == 'Thing'
Sequel::Model.plugin :defaults_setter
Item.plugin :defaults_setter
Item class << Sequel::Model
  plugin :defaults_setter
end
Item.default_values[:name] = 'foobar'