Можно ли использовать пользовательский тип столбца в миграции Rails? - PullRequest
1 голос
/ 20 сентября 2009

Мне нужно создать схему базы данных с миграциями Rails.

У меня есть много столбцов, которые содержат количество (кг) и цены (валюта).

В настоящее время я использую это:

  t.column :quantity, :decimal, :precision => 6, :scale => 3
  t.column :value, :decimal, :precision => 6, :scale => 2

При вызове генератора я использую quantity:decimal для идентификации моих столбцов. Затем я вручную изменяю сгенерированные строки t.decimal на вышеприведенные.

Мне это не нравится, потому что после каждой сгенерированной миграции мне приходится вручную редактировать скрипт миграции, и я беспокоюсь о DRY. (Что, если цена должна содержать четыре вместо двух десятичных знаков?)

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

  t.quantity :quantity
  t.price :value

PS: Я нуб Rails, извините, если это глупый вопрос.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2012

Просто продолжение: я закончил патчингом Rails:

class ActiveRecord::ConnectionAdapters::TableDefinition

  def price(*args)
    options = args.extract_options!
    options.reverse_merge!({ precision: 8, scale: 2 })
    column_names = args
    type = :decimal
    column_names.each { |name| column(name, type, options) }
  end

end

Это позволяет мне использовать price в качестве типа столбца, что приводит к четкой миграции.

create_table :stuff do |t|
  t.price :my_price
end
1 голос
/ 20 сентября 2009

Я уверен, что вы можете делать то, что просите - копаться в методе column в коде миграции - но я не думаю, что он поддерживается естественным путем. Я думаю, что идея миграций заключается в том, что они довольно близки к языку баз данных (и дальше от модели вашего домена), поэтому поддержка довольно ориентирована на базу данных.

Посмотрите на использование with_options (railscasts.com/episodes/42-with-options). Это позволит вам высушить одну миграцию, не исправляя рельсы.

Вы также можете создать вспомогательные методы в рамках миграции, которые СУШИТ ее. Я делаю это все время ... миграция - это просто класс Ruby, поэтому вы можете создать:

валюта определения (столбец) add_column: my_table, column,: deci ... и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...