Направляющие: создание пользовательского типа данных / создание стенографии

Я задаюсь вопросом, как я мог создать пользовательский тип данных для использования в файле миграции граблей. Пример: при создании модели в файле миграции можно добавить столбцы. Это могло быть похожим на это:

  def self.up
    create_table :products do |t|
      t.column :name, :string
      t.timestamps
    end
  end

Я хотел бы знать, как создать что-то вроде этого:

t.column :name, :my_custom_data_type

Причина этого для создания, например, типа "валюты", который является не чем иным как десятичным числом с точностью 8 и масштабом 2. Так как я использую только MySQL, решение для этой базы данных достаточно достаточно.

Спасибо за Вашу обратную связь и комментарии!

16
задан Shyam 11 April 2010 в 15:05
поделиться

1 ответ

Что вы хотите сделать, так это определить новый метод создания столбца, который предоставляет параметры для создания вашего пользовательского типа. По сути, это делается путем добавления метода, который ведет себя как t.integer ... в миграциях. Хитрость заключается в том, чтобы выяснить, куда добавить этот код.

Где-нибудь в каталоге инициализаторов поместите этот фрагмент кода:

module ActiveRecord::ConnectionAdapters
  class TableDefinition
    def currency (*args)
      options = args.extract_options!
      column_names = args
      options[:precision] ||= 8
      options[:scale] ||= 2
      column_names.each { |name| column(name, 'decimal', options) }
    end                                                                     
  end
end

Теперь вы можете использовать метод валюты и определять столбец валюты в любое время, когда вам это нужно.

Пример:

def self.up
  create_table :products do |t|
    t.currency :cost
    t.timestamps
  end
end

Чтобы добавить столбец валюты к существующей таблице:

def self.up
  change_table :products do |t|
    t.currency :sell_price
  end
end   

Предостережение: У меня нет времени тестировать его, поэтому нет никаких гарантий. Если это не сработает, это должно, по крайней мере, направить вас на верный путь.

22
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: