mač*_*ček 9 ruby import cron rake ruby-on-rails
目标:使用CRON任务(或其他预定事件)通过每晚从现有系统导出数据来更新数据库.
在现有系统中创建/更新/删除所有数据.该网站没有直接与该系统集成,因此rails应用程序只需要反映数据导出中出现的更新.
我有一个.txt约5,000种产品的文件,如下所示:
"1234":"product name":"attr 1":"attr 2":"ABC Manufacturing":"2222"
"A134":"another product":"attr 1":"attr 2":"Foobar World":"2447"
...
Run Code Online (Sandbox Code Playgroud)
所有值都是用双引号(")括起来的字符串,用冒号(:)分隔
领域是:
id: 唯一身份; 字母name: 产品名称; 任何角色vendor_name:string; 任何角色vendor_id:独特的供应商ID; 数字供应商信息在当前系统中未标准化.
这里的最佳做法是什么?是否可以删除产品和供应商表并在每个周期重写新数据?或者仅添加新行并更新现有行更好?
笔记:
Orders将通过夜间数据库导入持续生成的数据.OrderItems将需要连接到数据文件中指定的产品ID,因此我们不能依赖自动递增的主键对于每个导入都是相同的; 独特的字母数字ID将需要用于连接products到order_items.rake任务才能使用Product.create(...)和设置Vendor.create(...)语法.smn*_*ven 14
我不会在每个周期删除产品和供应商表.这是一个rails应用程序吗?如果是这样,有一些非常好的ActiveRecord助手可以为您派上用场.
如果您有产品活动记录模型,则可以执行以下操作:
p = Product.find_or_initialize_by_identifier(<id you get from file>)
p.name = <name from file>
p.size = <size from file>
etc...
p.save!
Run Code Online (Sandbox Code Playgroud)
find_or_initialize将按您指定的ID在数据库中查找产品,如果找不到,则会创建一个新产品.这样做非常方便的事情是ActiveRecord只会在任何数据发生变化时保存到数据库中,它会相应地自动更新表中的任何时间戳字段(updated_at).还有一件事,因为你要按标识符(文件中的id)查找记录,我会确保在数据库中的该字段上添加索引.
为了完成这个rake任务,我将rake文件添加到rails应用程序的lib/tasks目录中.我们称之为data.rake.
在data.rake里面,它看起来像这样:
namespace :data do
desc "import data from files to database"
task :import => :environment do
file = File.open(<file to import>)
file.each do |line|
attrs = line.split(":")
p = Product.find_or_initialize_by_identifier(attrs[0])
p.name = attrs[1]
etc...
p.save!
end
end
end
Run Code Online (Sandbox Code Playgroud)
要调用rake任务,请从命令行使用"rake data:import".
| 归档时间: |
|
| 查看次数: |
12590 次 |
| 最近记录: |