Как можно установить значения по умолчанию в моделях сиквела? - PullRequest
6 голосов
/ 19 июля 2009

Учитывая приведенный ниже код, как можно определить значения по умолчанию для модели. (допустим, по умолчанию для: 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}>]

Итак, я хотел бы, чтобы для второго созданного элемента было установлено значение # "Thing",: id => 2}>, а не: name => nil.

Ответы [ 3 ]

7 голосов
/ 05 августа 2009

Ответ Суббы - рекомендуемый способ сделать это в Сиквеле. Он помещает значение по умолчанию в базу данных.

Если вы хотите иметь значения по умолчанию в модели, а не в базе данных, я рекомендую использовать хук 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.

4 голосов
/ 20 июля 2009
DB.create_table :items do
        primary_key :id
        String :name,:default => 'Thing'
end

должен сделать трюк

из сиквела Sequel :: Блок базы данных source_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 class method_missing обрабатывает String, text, boolean, number обрабатываются методом столбца

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

пожалуйста, обратитесь к колонке сиквела для дополнительных опций

1 голос
/ 21 сентября 2017

Я могу установить значения по умолчанию с помощью 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'

Спасибо.

...