2016-12-22 7 views
0

rakeタスクのコンテキストで、パフォーマンス上の理由から、raw SQLの一括更新を使用しています。以下のような何か:Rakeタスクで未処理のSQLエラーを記録する

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は、レールのタスクの実行中に生産に失敗した場合すべてが、地域開発における「透明」である間(例えばプロモーション列がnilであると、文が無効になるため)エラーは記録されません。

これを手動でログに記録することもできますが、以下のように例外をキャッチすることもできますが、自動ログ記録を許可するオプションがあると便利です。

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に更新フィールドをデバッグしたい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に作成し、そこにすべての情報を保存します。しばらくするとログファイルのサイズに注意してください。

関連する問題