20

如何使用 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)吗?

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

4

6 回答 6

29

你的例子几乎是正确的。

使用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
于 2014-11-11T11:16:08.050 回答
14

一个不错的解决方案是使用活动记录导入 gem。我现在推荐它而不是内置的 Rails 批量插入,因为在违反约束的情况下,它的选项更加灵活。

TaxRate.import(
  [:income_from, :income_to, :start, :finish, :rate, :premium],
  tax_rates
)

它绝对比我的旧答案更好,它会触发数组中每个条目的数据库提交:)


老答案:

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

这样,您将检索一个带有truefalse知道哪个成功和哪个没有成功的数组。

于 2013-09-29T17:39:22.683 回答
7

如果您希望全部保存。或者,即使其中一个失败也不保存,您可以使用 'ActiveRecord::Base.transaction'

例如

ActiveRecord::Base.transaction do  
   tax_rate.each do |tax_rt|  
       TaxRate.new(tax_rt).save  
    end
 end
于 2013-09-29T18:46:02.480 回答
4

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

TaxRate.create(tax_rt)
于 2016-10-18T05:26:56.237 回答
0

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

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数组中的每个项目。

于 2013-09-29T17:42:10.040 回答
-2

使用 gem '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
于 2019-01-25T18:25:38.857 回答