2016-12-22 4 views
0

Я использую необработанные обновления для SQL-запросов (по соображениям производительности) в контексте задачи рейка. Что-то вроде следующего:Регистрация необработанных SQL-ошибок в Rake Tasks

update_sql = Book.connection.execute("UPDATE books AS b SET 
      stock = vs.stock, 
      promotion = vs.promotion, 
      sales = vs.sales 
      FROM (values #{values_string}) AS vs 
      (stock, promotion, sales) WHERE b.id = vs.id;") 

Хотя все «прозрачно» в местном развитии, если SQL терпит неудачу в производстве во время выполнения задачи рельсов (например, так как столбец поощрения равна нулю и утверждение становится недействительным) , ошибка не регистрируется.

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

begin 
... 
rescue ActiveRecord::StatementInvalid => e 
     Rails.logger.fatal "Books update: ActiveRecord::StatementInvalid: "+ e.to_s 
end 

ответ

0

Вы можете сделать свой собственный класс в папке модели: app/models/custom_sql_logger.rb:

class CustomSqlLogger 
    def self.debug(msg=nil) 
    @custom_log ||= Logger.new("#{Rails.root}/log/custom_sql.log") 
    @custom_log.debug(msg) unless msg.nil? 
    end 
end 

Затем перейдите к передней задаче, где вы хотели бы отлаживать обновленные поля, например lib/task/calculate_avarages.rake и вызвать ваш пользовательский отладчик:

CustomSqlLogger.debug "The field was successfully updated into DB" 

Пример из моего проекта:

require 'rake' 

task :calculate_averages => :environment do 
    products = Product.all 

     products.each do |product| 
     puts "Calculating average rating for #{product.name}..." 
     product.update_attribute(:average_rating, product.reviews.average("rating")) 

     CustomSqlLogger.debug "#{product.name} was susscefully updated into DB" 

     end 
    end 

Пользовательский отладчик создаст новый файл custom_sql.log в папку журнала: log/custom_sql.log и сохранит всю информацию там. Остерегайтесь размера файла журнала через некоторое время.

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