Rails: создание пользовательского типа данных / создание сокращения - PullRequest
16 голосов
/ 11 апреля 2010

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

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

22 голосов
/ 11 апреля 2010

То, что вы хотите сделать, это определить новый метод создания столбца, который предоставляет опции для создания вашего пользовательского типа. Что по существу делается путем добавления метода, который ведет себя как 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   

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

...