Rails: создание настраиваемого типа данных/создание сокращенного

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

  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, решение для этой базы данных достаточно.

Благодарим вас за комментарии и комментарии!

Ответы

Ответ 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   

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