我在rails中有一个方法,它可以做这样的事情:

a = Foo.new("bar")
a.save

b = Foo.new("baz")
b.save

...
x = Foo.new("123", :parent_id => a.id)
x.save

...
z = Foo.new("zxy", :parent_id => b.id)
z.save

问题是,我添加的实体越多,这需要的时间就越长.我怀疑这是因为它必须为每一条记录访问数据库.因为它们是嵌套的,我知道我不能在父母被保存之前保存子元素,但我想一次保存所有的父母,然后再保存所有的子元素.这样做会很好:

a = Foo.new("bar")
b = Foo.new("baz")
...
saveall(a,b,...)

x = Foo.new("123", :parent_id => a.id)
...
z = Foo.new("zxy", :parent_id => b.id)
saveall(x,...,z)

这一切只需点击两次数据库即可实现.在rails中有没有一种简单的方法可以做到这一点,还是我一次只能做一个?

推荐答案

全部插入(轨道6+)

Rails 6引入了一种新的方法insert_all,它在一条SQL INSERT语句中向数据库插入多条记录.

此外,该方法适用于does not instantiate any modelsdoes not call Active Record callbacks or validations.

所以

Foo.insert_all([
  { first_name: 'Jamie' },
  { first_name: 'Jeremy' }
])

它的效率明显高于

Foo.create([
  { first_name: 'Jamie' },
  { first_name: 'Jeremy' }
])

如果你只想插入新记录.

Ruby-on-rails相关问答推荐

为Rails服务器推荐的交付类型

Rails文档的悲观锁定示例中的争用条件

链轮轨道V4链接到外部Ruby 的 list 文件

如何在Rails中创建没有字符串的查询

如何使用 Rails 语义记录器记录整个请求(标头、正文等)

Rails 5:如何从数据库中删除列?

如何在 Windows 中更新 ruby

在 Rails 3.2 中更新多行

RSpec 设置会话对象

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

rails 模型 has_many 本身

从 before_action 中排除控制器

activerecord 查找所有未包含在数组中的内容

.increment vs += 1

在本地 Rails 开发环境中获取真实 IP 地址

如何在 VS Code 中自动格式化 Ruby 或 .erb 文件?

redirect_to 和 render 是可交换的吗?

从模型中获取验证

保存用户偏好的最佳方法?

如何从 ApplicationHelper 调用 ApplicationController 方法