ActiveRecord create:传入一组属性

Sun*_*Cho 8 activerecord ruby-on-rails

我想知道是否有一种Rails方法通过传入一组属性来创建多个记录.

例如,而不是

MyModel.create!(attr_1: some_attr, attr_2: 1)
MyModel.create!(attr_1: some_attr, attr_2: 2)
MyModel.create!(attr_1: some_attr, attr_2: 3)
MyModel.create!(attr_1: some_attr, attr_2: 4)
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

MyModel.create!(attr_1: some_attr, attr_2: [1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

但它不起作用.有没有类似的方法来实现这一点没有循环?

Зел*_*ный 18

根据文档,您可以create从一组哈希中记录:

attributes参数可以是Hash或Hashes数组.这些哈希描述了要创建的对象的属性.

 MyModel.create([{attr_1: some_attr, attr_2: 4}, {attr_1: some_attr, attr_2: 5}])
Run Code Online (Sandbox Code Playgroud)

  • 注意:这不会为那些尝试构建有效插入查询的人创建单个查询. (5认同)

Rob*_*bin 5

在提出这个问题时,ActiveRecord 没有任何内置功能可以一次有效地插入多条记录。截至今天,Rails 6 是当前的稳定版本,它附带Model#insert_all!了一种批量插入的方法。

你可以在这里找到它的文档https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-insert_all-21

值得一提的是,Rails 6 还实现Model#upsert_all!了在记录存在的情况下高效插入或更新的功能。