Ответ 1
tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save }
Таким образом вы получите массив с true
и false
, чтобы узнать, что получилось, а что нет.
Как сохранить этот массив в одном вызове с помощью 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)
?
Кроме того, есть ли способ удалить повторяющиеся символы, чтобы они выглядели аккуратно?
tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save }
Таким образом вы получите массив с true
и false
, чтобы узнать, что получилось, а что нет.
Ваш пример почти прав.
Используйте 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
Если вы хотите, чтобы все они были сохранены. или, если бы они не были сохранены, даже если один из них не удалось, вы можете использовать "ActiveRecord:: Base.transaction"
например.
ActiveRecord::Base.transaction do
tax_rate.each do |tax_rt|
TaxRate.new(tax_rt).save
end
end
Я не уверен в рельсах < 4.2, но я попробовал это в рельсах 4.2, вы можете просто сделать это
TaxRate.create(tax_rt)
Вот пример, похожий на ваш:
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
для каждого элемента массива.
используйте гем '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