web-dev-qa-db-fra.com

Comment enregistrer plusieurs enregistrements à la fois dans Rails?

Comment enregistrer ce tableau en un seul appel avec 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
    }]

Puis-je simplement appeler Rails.create(tax_rates)?

En outre, y a-t-il un moyen de supprimer les symboles en double afin qu'ils soient plus nets?

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

De cette façon, vous récupérerez un tableau avec true et false pour savoir ce qui a réussi et ce qui ne l’a pas fait.

13
apneadiving

Votre exemple est presque correct.

Utilisez ActiveRecord::Persistence#create , qui peut accepter un tableau de hachages en tant que paramètre.

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
21
Dennis

Si vous voulez que tous soient sauvegardés .ou non, même si un échoue, vous pouvez utiliser 'ActiveRecord :: Base.transaction' 

par exemple. 

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

Je ne suis pas sûr à propos de Rails <4.2 mais je l'ai essayé dans Rails 4.2, vous pouvez simplement le faire.

TaxRate.create(tax_rt)
3
user3209457

Voici un exemple comme le vôtre:

a = []

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

Le tableau est sauvegardé en une fois avec:

a.each(&:save)

Ceci appellera B#save sur chaque élément du tableau.

2
octoback