如何设置续集模型中的默认值?

时间:2009-07-19 08:44:29

标签: ruby model default sequel

根据下面的代码,如何为模型定义默认值。 (比如说:名称的默认值应该是'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。

3 个答案:

答案 0 :(得分:8)

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

如果您希望在模型中而不是在数据库中使用默认值,我建议使用before_createafter_initialize挂钩来执行默认操作:

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

after_initializebefore_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

请参阅sequel column for additional options

答案 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'

谢谢。

相关问题