У меня есть проблема, из-за которой двоичное представление адреса 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 и перезапущу его веснойбудет работать нормально.