【问题标题】:How to override created_at field in model when importing a CSV?导入 CSV 时如何覆盖模型中的 created_at 字段?
【发布时间】:2012-05-19 22:29:05
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    在 Rails 4 中:

    attr_accessible 不再使用,将其包含在模型的顶部可能会破坏您的代码。仅仅在传递给create! 的参数中包含:created_at 就可以了。

    在此处将@Ghoti 的评论转化为答案,以提高其知名度

    【讨论】:

    • 已确认 - 只需添加 created_at 作为参数即可在 Rails 4 中使用。
    【解决方案2】:

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

    class Tutorial < ActiveRecord::Base
      attr_accessible :created_at
    end
    

    【讨论】:

    • 请务必检查批量分配漏洞,here 是个好帖子
    • 由于 Rails 4 更改为通过控制器而不是模型控制访问,因此此答案已过时。我们不再使用 attr_accesible 并且 (!) 它应该“正常工作”
    【解决方案3】:

    也许你可以这样做:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 2014-01-03
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2017-05-07
      相关资源
      最近更新 更多