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?
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.
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
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
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)
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.