Ruby on rails 3 导入CSV时,如何覆盖模型中创建的_at字段?

Ruby on rails 3 导入CSV时,如何覆盖模型中创建的_at字段?,ruby-on-rails-3,Ruby On Rails 3,我正在使用以前创建的日期将全部等待列表注册的CSV导入到我的数据库中,如何在保持初始日期的同时导入它们,而不是让它们都显示相同的导入日期 我得到一个错误:Rails无法为id批量分配受保护的属性,该id是在 守则: csv_file = params[:csv][:file].read csv = CSV.parse(csv_file, :headers => false) csv.each do |row| Model.create!(:email =&

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

我得到一个错误:
Rails无法为id批量分配受保护的属性,该id是在

守则:

 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    

您需要将所需列添加到可访问的属性中

class Tutorial < ActiveRecord::Base
  attr_accessible :created_at
end
课堂教程
在Rails 4中:

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


将@Ghoti的评论转化为此处的答案,以提高其可视性

也许您可以这样做:

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

只需确保检查大规模分配漏洞,这是一个很好的建议,因为Rails 4更改为通过控制器而不是模型来控制访问。此答案已过时。我们不再使用attr_accessible和(!)它应该“正常工作”确认-只需添加
created_at
,因为参数在Rails 4中起作用。