在Ruby on Rails中,在保存到数据库之前汇总文件中的数据

时间:2012-12-06 15:55:38

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个概念性问题;我正在尝试编写代码来从s3下载日志,然后将一些数据解析并存储在rails应用程序的数据库中。

由于这是严格内部的,我只有一个具有下载和解析日志所需代码的模型。我解析的主要方法是打开一个文件,遍历每行解析出我想保存到数据库的某些数据。

我的目标是汇总文件中的所有数据(其中包含多个日志),然后将其保存到数据库中。

我正在努力掌握的是在将数据保存到Rails中的数据库之前,我将如何总结数据?

例如,如果我有以下日志:

log / account / 6 100
log / account / 7 250
log / account / 6 50
log / account / 5 100

我的目标是遍历所有行并保存每个帐户ID的总金额,因此在这个原因我想要保存帐户6,150作为总和。出于某种原因,我只能理解1个日志的1个数据库条目,而不是总结文件中的日志并将其转换为1个数据库条目。

当前解析过程:

   def self.create_from_log_file(file)
    s3log = File.open(file).each do |line|
    line_match = S3_LINE_REGEXP.match(line)# get the matchdata
    captures = Hash[ line_match.names.zip( line_match.captures ) ]# convert the matchdata to a hash key value pairs (both strings)
    validate_log_file(captures["timestamp"])# validate file is unique
    captures["http_status"] != 200 # figure out if API request was a http 200
    current_account = extract_account_id(captures["request_path"])# extract account id and find that account
    account_log = S3Log.new # instantiate a new S3Log instance
    account_log.account_id = Account.find_by_id(current_account) # assign the S3Log object its account id
    account_log.total_bytes = calculate_total_bytes_for_file(captures["bytes_sent"])# assign the log bytes to that accounts total for the file
    account_log.total_requests = calculate_total_requests_for_file(acount_log.account_id)# calculate total requests for that account on the file
    account_log.date = Date.parse(captures["timestamp"])
  end

  account_log.save!
end

1 个答案:

答案 0 :(得分:0)

一些高级指针。首先,由于您的代码可能是一个长期运行的工作,因此使用ResqueSidekiq

将其作为后台工作运行可能是值得的。

其次,将您的工作分解为小型定义良好的函数,然后为这些较小的函数编写测试。然后,您将有信心将它们组合成更大的部分,即实践功能分解。或者,以OO方式,创建模型来封装解析逻辑,另一个用于表示感兴趣的行,可能还有第三个用于表示可以在其上执行聚合方法的行集合。

希望这有帮助。