编辑:为了清楚起见,我完全重写了这个问题。我之前没有得到任何评论也没有答案。
我正在维护一个包含大量统计数据的2.x Rails应用程序。有些数据是真实的,有些数据是在未来几年估算的。每年我都需要使用实际数据更新估算数据并计算新估算值。
我一直在使用BIG yml文件和迁移来每年将数据加载到应用程序中。我的迁移充满了估算计算和数据修正。
问题
我的迁移充满了非模式相关的材料,我甚至无法做到db:migrate:reset而不需要等待几个小时(如果它甚至可以工作)。我很乐意看到我的迁移很干净 - 只有与架构相关的修改。但是,如果不使用迁移,我想如何每年更新数据?
需要帮助
我想听听你的意见和答案。我不是在寻找灵丹妙药 - 更像是人们处理类似情况的最佳实践和想法。
答案 0 :(得分:1)
首先,我不得不说这是一个非常有趣的问题。据我所知,从迁移中加载数据并不是一个好主意。一般来说,您应该使用db / seeds.rb在数据库中加载数据,我认为编写一个小类助手放入lib目录然后从db / seeds.rb调用它是个好主意。我想你可以用以下方式组织你的文件:
lib/data_loader.rb
lib/years/2009.rb
lib/years/2010.rb
显然,您应该以您希望的方式清除迁移并编写lib / data_loader.rb的代码,但我只想提供一个关于如何组织代码的一般概念,如果我不得不面对一个问题那样的。
我不确定我是否以一种有帮助的方式回复了你的问题,但我希望能够这样做。
答案 1 :(得分:1)
如果我是你,我会去创建自定义rake任务。您可以访问所有模型和活动记录连接,每年一次,您将最终完成:
rake calculate
答案 2 :(得分:1)
听起来你每年进行一次大型操作(使用yml文件加载数据),但每月操作次数较少。
根据我对统计数据的经验,您可能最终会做越来越多的这些操作来清理和添加更多数据。
我会使用像resque和resque scheduler这样的工作处理框架。
您可以安排作业每月,每年,每天或持续运行一次。作业就像加载yml文件(或一组yml文件)或清理数据一样。您可以控制要发送到作业的参数,这样您就可以使用一个类,但可以根据您排队或安排作业的方式替换它更新或清理数据的方式。
答案 3 :(得分:0)
我遇到的情况是,我需要从不经常更改的CSV文件加载数据,并每天从Internet更新数据。我将在如何做前者方面加入一些完整的例子。
首先我在lib/tasks/update.rake
中有一个rake文件:
require 'update/from_csv_files.rb'
namespace :update do
task :csvfiles => :environment do
Dir.glob('db/static_data/*.csv') do |file|
Update::FromCsvFiles.load(file)
end
end
end
=> :environment
表示我们可以通过常用模型访问数据库。
然后我在lib/update/from_csv_files.rb
文件中有代码来完成实际工作:
require 'csv'
module Update
module FromCsvFiles
def FromCsvFiles.load(file)
csv = CSV.open(file, 'r')
csv.each do |row|
id = row[0]
s = Statistic.find_by_id(id)
if (s.nil?)
s = Statistic.new
s.id= id
end
s.survey_area = row[1]
s.nr_of_space_men = row[2]
s.save
end
end
end
end
然后,只要我的CSV文件发生变化,我就可以运行rake update:csvfiles
来加载新数据。我还有另一个以类似方式设置的任务来更新我的日常数据。
在您的情况下,您应该能够编写一些代码来加载YML文件或直接进行计算。要处理较小的更正,您可以创建一个通用方法来加载YML文件,并使用rake任务中的特定文件调用它。这样,您只需要包含YML文件并使用新任务更新rake文件。要处理执行顺序,您可以执行rake任务,以适当的顺序调用其他rake任务。我现在只是抛出一些想法,你比我更清楚。