Можно ли обойти sql_color в журналах активных записей Rails? - PullRequest
0 голосов
/ 13 февраля 2019

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

Запрос работает и возвращает ожидаемые результаты.

Я думаю, это потому, что двоичный IPv6 выглядит следующим образом:

"\ xFE \ x80 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00\ x00 \ f "

И метод sql_color интерпретирует это как управляющие коды.

Если я установил:

Rails.applicaiton.config.colorize_logging = false

Он все еще делает это, хотя нетдольше показывается любой цвет.

В идеале я хотел бы знать, как лучше обойти sql_color.

Сейчас я только что переопределил метод и поместил его в блок begin / rescue.

Как воспроизвести:

   rails new binary_bug -d mysql
   cd binary_bug
   rails db:create
   rails g model Bug name:text first_ip:binary second_ip:binary

Обновить миграцию до

 class CreateBugs < ActiveRecord::Migration[5.2]
  def change
    create_table :bugs do |t|
      t.text :name
      t.binary :first_ip, limit: 16
      t.binary :second_ip, limit: 16

      t.timestamps
    end
  end
end
rails db:migrate
Bug.create(name: 'test1', first_ip: IPAddr.new('fe80::c').hton, second_ip: IPAddr.new('fe80::c').hton.to_s )
Bug.create(name: 'test2', first_ip: IPAddr.new('2001:db8:1234::').hton, second_ip: IPAddr.new('2001:db8:1234:ffff:ffff:ffff:ffff:ffff').hton.to_s )
# Try to search the DB.
bugs = Bug.where("first_ip > ?", IPAddr.new('2001:db8:1234::12').hton)

Это даст очень длинную ошибкукоторый начинается с:

Не удалось зарегистрировать событие «sql.active_record».ArgumentError: недопустимая последовательность байтов в UTF-8

Первый файл, на который он указывает:

gems / activerecord-5.2.2 / lib / active_record / log_subscriber.rb: 71:in `sql_color '"

Это частный метод, который выглядит следующим образом:

  def sql_color(sql)
    case sql
    when /\A\s*rollback/mi
      RED
    when /select .*for update/mi, /\A\s*lock/mi
      WHITE
    when /\A\s*select/i
      BLUE
    when /\A\s*insert/i
      GREEN
    when /\A\s*update/i
      YELLOW
    when /\A\s*delete/i
      RED
    when /transaction\s*\Z/i
      CYAN
    else
      MAGENTA
    end
  end

Если я заменим его просто на MAGENTA или заверну в блок begin / rescue и перезапущу его веснойбудет работать нормально.

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