如何在Rails中一次保存多条记录?

时间:2013-09-29 17:35:32

标签: ruby-on-rails ruby

如何使用Rails在一次调用中保存此数组?

tax_rates = [{
  :income_from => 0
  :income_to  => 18200
  :start => "01-07-2013"
  :finish => "30-06-2014"
  :rate => nil
  :premium => nil
  },{
  :income_from => 18201
  :income_to  => 37000
  :start => "01-07-2013"
  :finish => "30-06-2014"
  :rate => 0.19
  :premium => nil
  },{
    :income_from => 18201
    :income_to  => 37000
    :start => "01-07-2013"
    :finish => "30-06-2014"
    :rate => 0.19
    :premium => nil
    }]

我可以致电Rails.create(tax_rates)吗?

另外,有没有办法删除重复的符号,使它们看起来更整洁?

6 个答案:

答案 0 :(得分:22)

你的例子几乎是正确的。

使用ActiveRecord::Persistence#create,它可以接受哈希数组作为参数。

tax_rates = [
  {
    income_from: 0,
    income_to: 18200,
    start: "01-07-2013",
    finish: "30-06-2014",
    rate: nil,
    premium: nil,
  },
  {
    income_from: 18201,
    income_to: 37000,
    start: "01-07-2013",
    finish: "30-06-2014",
    rate: 0.19,
    premium: nil,
  },
  # ...
]

TaxRate.create(tax_rates)  # Or `create!` to raise if validations fail

答案 1 :(得分:14)

tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save } 

通过这种方式,您将检索一个包含truefalse的数组,以了解哪些数据成功,哪些数据没有成功。

答案 2 :(得分:6)

如果你想要保存所有这些,或者即使一个失败也不保存它们,你可以使用'ActiveRecord :: Base.transaction'

e.g。

ActiveRecord::Base.transaction do  
   tax_rate.each do |tax_rt|  
       TaxRate.new(tax_rt).save  
    end
 end

答案 3 :(得分:3)

我不确定rails< 4.2但我在rails 4.2中尝试过它你可以简单地做到这一点

TaxRate.create(tax_rt)

答案 4 :(得分:2)

这是一个像你一样的例子:

a = []

a << B.new(:name => "c")
a << B.new(:name => "s")
a << B.new(:name => "e")
a << B.new(:name => "t")

使用以下命令保存数组:

a.each(&:save)

这会在数组中的每个项目上调用B#save

答案 5 :(得分:-1)

使用宝石“ fast_inserter”:https://github.com/joinhandshake/fast_inserter

它生成一个包含数千条记录的SQL查询。

movie_data = [1, 'Climates (Iklimler)', 'Clay Pauwel', 'Drama'],
          [2, 'Tinpis Run', 'Andros Glazer', 'Comedy'],
          [3, 'Naked City, The', 'Bethena Chatband', 'Mystery'],
          [4, 'Small Time Crooks', 'Naomi Plom', 'Crime'],
          [5, 'Shadowboxer', 'Georgeanne Widdicombe', 'Thriller']

    params = {
      table: 'movies',
        static_columns: {
          created_at: '0000-00-00 00:00:00',
          updated_at: '0000-00-00 00:00:00',
        },
      options: {
        timestamps: false,
        unique: true,
        check_for_existing: true
      },
        group_size: 100,
        variable_columns: %w(id title director description),
        values: movie_data
    }
    inserter = FastInserter::Base.new(params)
    inserter.fast_insert