如何在导入CSV时覆盖模型中的created_at字段?

时间:2012-05-19 22:29:05

标签: ruby-on-rails-3

我正在使用以前创建的日期将完整的等待列表注册CSV导入我的数据库,如何在保留初始日期的同时导入它们,而不是让它们都显示相同的导入日期?

我收到错误:Rails can't mass-assign protected attributes for id, created_at

代码:

 csv_file = params[:csv][:file].read
    csv = CSV.parse(csv_file, :headers => false) 
    csv.each do |row|
       Model.create!(:email => row[0], :created_at => row[1])    
    end    

3 个答案:

答案 0 :(得分:11)

在Rails 4中:

attr_accessible已不再使用,并且将其包含在模型的顶部可能会破坏您的代码。仅仅在传递给:created_at的args中包含create!就应该这样做。

将@ Ghoti的评论转变为答案,以提高其可见度

答案 1 :(得分:5)

您需要将所需的列添加到attr_accessible

class Tutorial < ActiveRecord::Base
  attr_accessible :created_at
end

答案 2 :(得分:0)

也许您可以执行以下操作:

csv.each do |row|
   doc = Model.create!(:email => row[0])
   doc.update(created_at: row[1])
end

我需要做类似的事情,回顾组织,并根据最早注册的用户(如果适用)更新创建内容。 (组织ID是自定义字符串:-)

因此,您可以看到update命令的工作原理...,并且可以看到聪明把戏,使用BSON ID来获取日期。

Org.all.to_a.collect do |o|
  u = o.users.first
  if u
    o.update(created_at: Time.parse(u.id.generation_time.strftime('%Y-%m-%d %H:%M')))
  else
    o.update(created_at: Time.now.utc)
  end
end