根据下面的代码,如何为模型定义默认值。 (比如说:名称的默认值应该是'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}>]
所以,我想将第二个创建的项目设置为#&lt; Item @values = {:name =&gt;“Thing”,:id =&gt; 2}&gt;而不是:name =&gt; nil。
答案 0 :(得分:8)
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
。
答案 1 :(得分:5)
DB.create_table :items do
primary_key :id
String :name,:default => 'Thing'
end
应该做的伎俩
续集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
里面的Schema :: Generator类method_missing句柄String,text,boolean,number由列方法处理
def method_missing(type, name = nil, opts = {})
name ? column(name, type, opts) : super
end
答案 2 :(得分:0)
我可以使用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'
谢谢。