Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将大量数据插入嵌套模型_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 将大量数据插入嵌套模型

Ruby on rails 将大量数据插入嵌套模型,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我一直在关注大量插入数据。一切都很好,我的交易时间从大约30秒减少到不到1:) 我只是不知道如何填充子模型中的字段: has_many :check, :dependent => :destroy accepts_nested_attributes_for :check, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true 以前,我用过这个: ... User.create!(:

我一直在关注大量插入数据。一切都很好,我的交易时间从大约30秒减少到不到1:)

我只是不知道如何填充子模型中的字段:

has_many :check, :dependent => :destroy
accepts_nested_attributes_for :check, :reject_if => lambda { |a| a[:value].blank? },   :allow_destroy => true   
以前,我用过这个:

...
User.create!(:username => username, :check_attributes => [ {:attribute_name => "User-Password", :value => password, :op => ":="}])   
...
由于采用了另一种方法,我现在的用户模型中有了以下内容:

  def self.activerecord_extensions_mass_insert(validate = true)
        columns = [:username]
        values = []
         10000.times do
           username = ""
           5.times { username << (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }
           values.push [username]
         end
        User.import columns, values, {:validate => validate}
  end

有什么建议吗?

导入将不接受嵌套,因此我认为您不适合这种方法。 为什么不使用两个字符串,user_sql和check_sql,然后在循环过程中为扩展插入手动构建每个sql语句。然后可以运行两个查询,而不是一堆查询。 从好的方面来看,您将从多个查询的索引惩罚中节省更多的时间

编辑以添加代码: 您可以一次构建两个sql语句,这样就可以通过user_id使它们相互关联,然后在最后执行。如果这些东西可能进入生产环境,请将sql调用封装在事务中,这样就不会发生任何意外

user_sql = "INSERT into users (id,username,password) VALUES\n"
check_sql = "INSERT into check_attributes (user_id,foo,bar) VALUES\n"
random_data_pool = [('0'..'9'),('A'..'Z'),('a'..'z')].collect(&:to_a).flatten
max_loop = 10

1.upto(max_loop) do |i|
 seperator = (i == max_loop) ? ';' : ",\n"
 username = (1..5).map{ random_data_pool[Kernel.rand(random_data_pool.size)] }.join
 password = (1..5).map{ random_data_pool[Kernel.rand(random_data_pool.size)] }.join
 user_sql += "(#{i},'#{username}','#{password}')" + seperator
 check_sql +="(#{i},true,'potato')" + seperator
end


ActiveRecord::Base.connection.execute(user_sql)
ActiveRecord::Base.connection.execute(check_sql)

谢谢你的回复。最后一点让我有点心烦意乱!你能给我指出一个教程的方向或举个例子吗?我不认为有教程,因为你要做的可能是非常特定于你的需要。我将尝试更正一个我今天所说的示例。很抱歉,延迟了,我已经有一段时间没有登录了。我会看看的,我一直在努力,这是很有道理的。控制台中的问题是它自己创建ID。因此,从技术上讲,一个用户上的“ActiveRecord::RecordNotUnique:Mysql2::error:密钥“PRIMARY”的重复条目“1”应该通过多次“检查”创建。Cheers在周围做了一些事情,并使它工作起来。谢谢你的帮助:)添加了一个你正在寻找的例子编辑。
user_sql = "INSERT into users (id,username,password) VALUES\n"
check_sql = "INSERT into check_attributes (user_id,foo,bar) VALUES\n"
random_data_pool = [('0'..'9'),('A'..'Z'),('a'..'z')].collect(&:to_a).flatten
max_loop = 10

1.upto(max_loop) do |i|
 seperator = (i == max_loop) ? ';' : ",\n"
 username = (1..5).map{ random_data_pool[Kernel.rand(random_data_pool.size)] }.join
 password = (1..5).map{ random_data_pool[Kernel.rand(random_data_pool.size)] }.join
 user_sql += "(#{i},'#{username}','#{password}')" + seperator
 check_sql +="(#{i},true,'potato')" + seperator
end


ActiveRecord::Base.connection.execute(user_sql)
ActiveRecord::Base.connection.execute(check_sql)