ActiveRecord#create不允许设置id

ActiveRecord#create不允许设置id,activerecord,mass-assignment,Activerecord,Mass Assignment,我需要批量插入>100.000条记录。 DB不会创建id,我必须使用给定的UUID: 使用mymodel.new在循环中执行此操作分配ID,然后保存记录将起作用,但速度太慢(大约20分钟) 当我创建一个数组“记录”并使用mymodel.create(记录)时,我遇到了“无法批量分配id”问题。 我已经尝试了我能找到的所有解决方案: 模型的“attr_accessible:id,…”。适用于除id以外的所有人 (重新)定义“def self.attributes\u protected\u by

我需要批量插入>100.000条记录。 DB不会创建id,我必须使用给定的UUID: 使用mymodel.new在循环中执行此操作分配ID,然后保存记录将起作用,但速度太慢(大约20分钟)

当我创建一个数组“记录”并使用mymodel.create(记录)时,我遇到了“无法批量分配id”问题。 我已经尝试了我能找到的所有解决方案:

  • 模型的“attr_accessible:id,…”。适用于除id以外的所有人
  • (重新)定义“def self.attributes\u protected\u by_default[]end”-无效
  • 一个建议是使用'create'with':without_protection=>true',但create不接受多个参数
.因此,这两种解决方案都没有帮助。
我还能做什么呢?

最后,我找到了一个解决方案,虽然在Rails方面可能并不优雅,但它解决了我的性能问题:

起初,我尝试了@Albin建议的方法,结果发现创建(记录)的速度并没有更快(仍然>15分钟)

我现在的解决办法是:

  • 创建一个临时CSV文件

    db_tmp = File.open("tmp_file", "w")
    records = ""
    @data_records.each do |row|
      records << "#{row['id']},#{row['id']},#{field_1},#{row['field_2']}, ... \n"
    end
    db_tmp.write(records)
    db_tmp.close
    
整个过程现在持续不到1(!)分钟,包括通过网络获取数据和将原始json消息解析为哈希

我知道这并没有说明create是如何被欺骗而允许ID分配的,但是性能问题已经解决了


另一点是,我的解决方案绕过了为模型定义的任何验证。这不是一个问题,因为在这种情况下,我知道我可以依赖我接收的数据的完整性—如果出现问题,加载将失败,执行将引发异常。

记录中的id存储在id列中是否重要?也许可以创建一个
外部\u id
列,并将id插入其中,避免与rails就mass\u分配发生冲突?
sql = "load data infile 'tmp_file' into table my_table 
  fields optionally enclosed by '\"' terminated by ','
  (id,field_1,field_2, ... )"
ActiveRecord::Base.connection.execute(sql)