构建、创建和创建之间的区别以及应该在什么时候使用它们?

所以最近我看到越来越多的人在他们的控制器中使用 .build.create.create!。仅仅使用 .new并传递 param’d 对象和 .save有什么区别?有利有弊吗?使用这些其他方法有好处吗?

71060 次浏览

# create 是 new 和 save 的缩写。 如果验证不正确,# create! 将抛出异常。

虽然有一些不同,但并不是很大:

  1. .create相当于 .new后面跟着 .save。它只是更简洁。
  2. .create!等效于 .new后面跟着 .save!(如果保存失败将抛出一个错误)。还短了一点
  3. 我认为 .build差不多吧,是 .new的别名。它是 在 Rails 3中是单向工作的,也是 Rails < 3. x 中的另一种方式

然而,最重要的部分是,可以通过关联(has_many等)调用这些方法来自动链接两个模型。

我赞成上述答案。另外,对于 create,不能将 false作为参数传递,这可以用 save来实现。将 false作为参数传递将跳过所有 Rails 验证

虽然 create调用 new,然后调用 save是正确的,但是这两个选项在返回值上有很大的差异。

根据对象是否成功保存到数据库,Save返回 truefalse。然后可以按照上面问题中的第一个示例将其用于流控制。

无论对象是否保存,Create都将返回模型。这对上面的代码有影响,因为即使对象验证失败且没有保存,也始终会执行 if语句的顶部分支。

如果使用带有分支逻辑的 create,则存在无声故障的风险,而使用 new + save则不会出现这种情况。

如果记录无效,create!不会出现引发的相同问题和异常。

在使用 respond_with作为 API (JSON/XML)响应的控制器中,create备选方案非常有用。在这种情况下,对象上错误的存在将导致在响应中返回具有 unprocessable_entity状态的错误,这正是您希望从 API 得到的。

对于 html,我总是使用 new + save选项,特别是当您依赖返回值进行流控制时。