给定下面的代码,如何为模型定义默认值.(比方说,默认为: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.
Subba的答案是在Sequel中推荐的方法.它将默认值推送到数据库中.
如果您想在模型中而不是在数据库中使用默认值,我建议使用before_create或after_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.
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)
| 归档时间: |
|
| 查看次数: |
6078 次 |
| 最近记录: |