我正在尝试在rails 3中创建一个新的rake任务。
我有两个csv文件(gas.csv& elec.csv),其使用数据每十五分钟从SQL数据库更新一次。 csv的格式如下(我无法控制):
MeterID,RoundedTimeStamp,Value,Register
165,31/01/2012 00:00,1200,0
165,28/02/2012 00:15,1201,0
165,31/03/2012 00:30,1199,0
csv每月更新一次新值,我想编写一个rake导入任务,将文件导入模型的相关部分,Usage(month,elec,gas)。到目前为止,我已经为elec导入提供了以下内容,但这并没有真正起作用:
require 'csv'
desc "Importing Usage data from CSV file"
task import: :environment do
file = ".../elec.csv"
CSV.foreach(file, headers: true) do |row|
Usage.find_or_create_by_month({
month: row[1],
elec: row[2]
})
end
end
当我运行rake:从控制台导入时,它会很好地导入电子使用数据,但不会跳过重复项。有没有办法可以导入这个没有重复的文件,还有一种方法可以对气体数据做同样的事情吗?
注意:我知道最好使用first_or_create而不是find_or_create,但这不适用于_by_month。
干杯!
答案 0 :(得分:2)
User.where(month: row[1]).first_or_create do |user|
user.elec = row[2]
end
http://apidock.com/rails/ActiveRecord/Relation/first_or_create
的更多信息答案 1 :(得分:1)
您可以尝试Upsert
:
require 'upsert'
require 'active_support/core_ext' # you'll already have this in Rails
# ...
u = Upsert.new Usage.connection, Usage.table_name
# ...
CSV.foreach('elec.csv', headers: :first_row) do |row|
date = Date.parse row['RoundedTimeStamp']
selector = { meter_id: row['MeterID'], month: date.strftime('%Y-%m') }
setter = { elec: row['Value'] }
u.row selector, setter
end
CSV.foreach('gas.csv', headers: :first_row) do |row|
date = Date.parse row['RoundedTimeStamp']
selector = { meter_id: row['MeterID'], month: date.strftime('%Y-%m') }
setter = { gas: row['Value'] }
u.row selector, setter
end
如果您的“月份”列是字符串字段,那么这将有效。如果它是一个真实的日期字段,那么您可以尝试使用每月的第一个:
date.strftime('%Y-%m-01')