2016-12-22 17 views
0

我在rake任务的上下文中使用原始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中生产钢轨任务的执行过程中失败(例如,由于促进列是零,声明无效) ,没有错误记录。

我可以手动记录这个捕获异常,如下所示,但是一些允许自动记录的选项会更好。

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 

然后去rake任务,你想调试更新的领域例如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并保存所有信息。一段时间后要小心日志文件的大小。