Накладываем швы на ActiveRecord::SchemaDumper

March 28, 2017

В рейлс primary key - желательно делать id, формально конечно можно поставить что-то другое, но гарантия заканчивается очень быстро. У нас в одном проекте сделали ключом uuid и конечно же сломался дамп схемы. Где сломался дамп схемы, там сломались тесты и вообще не хорошо все это.

Иногда получается вставить аккуратный монкей-патч, но тут нужно было фиксить увесистый приватый метод ActiveRecord::SchemaDumper#table. Обычно я делаю так:

  1. Добавляю файл в config/initializers, обычно это достаточно удачное время
  2. Копирую подопытный метод целиком, по возможности с условиями: if defined?(ActiveRecord::SchemaDumper) ...
  3. Обязательно ставлю ассерт на текущую версию рейлс raise "review and update this patch for Rails upgrade" if Rails.version != "4.2.8"
  4. Каждое вмешательство оформляю ярко, примерно так:
  ##### [BEGIN PATCH 2]
  # # original code
  # next if column.name == pk
  # @connection.column_spec(column, @types)

  # # patched code
  if column.name == pk
    if pk == "uuid"
      @connection.column_spec(column, @types).merge(primary: "primary: true")
    else
      next
    end
  else
    @connection.column_spec(column, @types)
  end
  ##### [END PATCH 2]

В данном случае удалось обойтись тремя швами и схема как новенькая.

comments powered by Disqus