2013-03-22 3 views
5

Я пытаюсь написать собственный метод временных меток, который запускается во время миграции. Тот, который на месте теперь добавляет ограничение NOT_NULL в поле, и я действительно этого не хочу.Rails/Ruby Как переопределить метод миграции timestamps

Проблема заключается в том, что у меня есть база данных с несколькими схемами. Где каждый крупный клиент получает свою собственную схему. Когда мы на борту нового клиента, мы создаем новую запись арендатора, а затем выполняем миграцию для новой чеканной схемы.

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

Последняя миграция, в которой я бежала, использовала несколько более старую версию рельсов. Тем не менее в 3-х, но свист старше. Когда он создал метки времени, они были NULLable. Когда я запустил миграцию на днях (на новых рельсах) ... Ну все поля теперь NOT_NULL

У меня есть код, который был разработан с идеей, что updated_at был заполнен только при обновлении записи ... а не когда он был создан. (сторонние приложения и функции «базы данных» создают записи). Приложения сторонних разработчиков и функции базы данных, которые создают записи, падают на новую схему ... Я ушел и удалил все ограничения NOT_NULL на всех таблицы вручную, но я не хочу, чтобы писать очистку прямо в мою задачу миграции, так что все будущие таблицы исправлены.

Я понял, что лучше всего было бы переопределить метод временных меток, который был изменен, обратно на тот, который не нарушил существующий код.

Итак, есть причина, по которой мне нужно вернуться/переопределить ..
Мой вопрос сейчас ... Как переопределить метод. Я не могу видеть ясный путь класса к нему, и я не совсем уверен, как изменить это ..

ответ

4

Положите это в патч обезьяны ... Легко как!

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition 
    def timestamps(*args) 
    options = args.extract_options! 
    column(:created_at, :datetime, options) 
    column(:updated_at, :datetime, options) 
    end 
end 

Как сказал Маниек. Из-за этого «исправления» будут проигнорированы обновления для рельсов.

Но его первоначальное предложение делает то же самое. Кроме того, чтобы приспособиться к его исправлению, вам нужно будет вернуться через миграцию и заменить «метки времени» на новый код. Добавьте к этому, что вам придется заменить все будущие автоматически сгенерированные миграции тоже.

Я не думаю, что это хорошо подходит для СУХОЙ .. И это не подходит в SPOT.

Just B carellll!

1

, что случилось с:

create_table :foo do |t| 
    t.text :bar 
    t.datetime :created_at 
    t.datetime :updated_at 
end 

?

+0

У меня уже более 50 миграций, я не хочу их изливать, меняя их все на эту парадигму. Я также не хочу менять код в rails, создавая эшафот, чтобы он помещал разбитое datetime вместо timestamps. – baash05

+3

@daveatflow, изменяющий миграцию, несомненно, приведет вас к меньшему, чем задание вопроса :) Что касается того, где переопределить: можно ли запускать рейк-задачи с включенной отладкой? поместите вызов 'debugger' внутри блока create_table, перейдите в метод timestamps, вы должны получить местоположение файла. Я лично не рекомендую это, так как это также может измениться в будущих версиях рельсов. – maniek

+0

Ну, как я уже сказал, у меня более 50 миграций, мне пришлось бы изменить их все, и вся будущая миграция, создаваемая рельсами.Мне также пришлось бы документировать, что другим пришлось менять рельсы миграции. Логика отладчика ... теперь это умно. К изменению будущих версий. Я специально стараюсь избегать этого. Если они меняют имена полей (например), то у меня есть одна база данных, две схемы, которые должны быть одинаковыми, но имеют разные имена полей. – baash05

Смежные вопросы