Я задаюсь вопросом, как я мог создать пользовательский тип данных для использования в файле миграции граблей. Пример: при создании модели в файле миграции можно добавить столбцы. Это могло быть похожим на это:
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, решение для этой базы данных достаточно достаточно.
Спасибо за Вашу обратную связь и комментарии!
Что вы хотите сделать, так это определить новый метод создания столбца, который предоставляет параметры для создания вашего пользовательского типа. По сути, это делается путем добавления метода, который ведет себя как 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
Предостережение: У меня нет времени тестировать его, поэтому нет никаких гарантий. Если это не сработает, это должно, по крайней мере, направить вас на верный путь.