Как сохранить несколько записей сразу в Rails?

Как сохранить этот массив в одном вызове с помощью 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)?

Кроме того, есть ли способ удалить повторяющиеся символы, чтобы они выглядели аккуратно?

Ответ 1

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

Таким образом вы получите массив с true и false, чтобы узнать, что получилось, а что нет.

Ответ 2

Ваш пример почти прав.

Используйте 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

Ответ 3

Если вы хотите, чтобы все они были сохранены. или, если бы они не были сохранены, даже если один из них не удалось, вы можете использовать "ActiveRecord:: Base.transaction"

например.

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

Ответ 4

Я не уверен в рельсах < 4.2, но я попробовал это в рельсах 4.2, вы можете просто сделать это

TaxRate.create(tax_rt)

Ответ 5

Вот пример, похожий на ваш:

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 для каждого элемента массива.

Ответ 6

используйте гем '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