5

我正在将一个包含先前创建日期的候补名单注册的 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    
4

3 回答 3

15

在 Rails 4 中:

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

在这里将@Ghoti 的评论变成答案,以使其更具可见性

于 2016-01-04T03:31:35.183 回答
6

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

class Tutorial < ActiveRecord::Base
  attr_accessible :created_at
end
于 2012-05-20T00:26:46.983 回答
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
于 2019-02-15T02:32:00.897 回答