Ruby 如何设置Sequel模型中的默认值?
给定下面的代码,如何为模型定义默认值。 (假设:name的默认值应该是'Thing')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
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'