如何使用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)
吗?
另外,有没有办法删除重复的符号,使它们看起来更整洁?
答案 0 :(得分:22)
你的例子几乎是正确的。
使用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
答案 1 :(得分:14)
tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save }
通过这种方式,您将检索一个包含true
和false
的数组,以了解哪些数据成功,哪些数据没有成功。
答案 2 :(得分:6)
如果你想要保存所有这些,或者即使一个失败也不保存它们,你可以使用'ActiveRecord :: Base.transaction'
e.g。
ActiveRecord::Base.transaction do
tax_rate.each do |tax_rt|
TaxRate.new(tax_rt).save
end
end
答案 3 :(得分:3)
我不确定rails< 4.2但我在rails 4.2中尝试过它你可以简单地做到这一点
TaxRate.create(tax_rt)
答案 4 :(得分:2)
这是一个像你一样的例子:
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
。
答案 5 :(得分:-1)
使用宝石“ 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