【问题标题】:The differences between .build, .create, and .create! and when should they be used?.build、.create 和 .create 之间的区别!什么时候应该使用它们?
【发布时间】:2010-09-29 01:18:50
【问题描述】:

所以我最近越来越多地看到人们在他们的控制器中使用.build、.create 和.create!。与仅使用 .new 并传递参数对象然后 .save 有什么区别?有优点和缺点吗?使用这些其他方法是否有好处?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    有一些差异,但并不大:

    1. .create 等价于 .new 后跟 .save。它更简洁。
    2. .create! 等价于 .new 后跟 .save! (如果保存失败则抛出错误)。它也只是稍微短了一点
    3. 我认为.build大部分是.new 的别名。它works one way in Rails 3 和 Rails 中的另一种方式

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

    【讨论】:

    • 我选择这个作为最正确的答案是因为提到了能够将相关模型与它们链接起来——这是我认为使用 .new 和 .save 的一个有趣且重要的区别。这需要一些额外的工作。谢谢。
    • 对 3 的小说明 - 构建不仅仅是新的 - 它还设置了关联链接。
    • 构建与新建不同。但不同之处不在于它设置了关联链接(New 也为新实例这样做)。不同之处在于 Build 使用新实例填充调用者,但 New 没有。例如: Wall.posts.new 为您提供与您的 Wall 关联的新帖子,但在此调用之后 Wall.posts 仍然为空。 Wall.posts.build 为您提供与您的 Wall 关联的新帖子,并且您的 Wall.posts 现在有一个帖子。
    • 现在不就是一个别名,没有什么特殊功能吗?
    • 在 Rails 4 中,我刚刚签入控制台。 wall.posts.new 和 wall.posts.build 都以完全相同的方式填充墙对象。表示在 wall.posts.new 之后,wall.posts 不是 Amin 评论中声称的空。
    【解决方案2】:

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

    Save 返回true 或false,具体取决于对象是否成功保存到数据库。然后可以根据上述问题中的第一个示例将其用于流量控制。

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

    如果您将create 与分支逻辑一起使用,您将面临静默失败的风险,如果您使用new + save,则不会出现这种情况。

    create! 不会遇到与记录无效时引发的相同问题和异常。

    create 替代选项在 respond_with 用于 API (JSON/XML) 响应的控制器中很有用。在这种情况下,对象上存在错误将导致错误在响应中返回状态为unprocessable_entity,这正是您希望从 API 中获得的。

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

    【讨论】:

      【解决方案3】:

      #create 是 new 和 save 的较短版本。 #创建!如果验证不是肯定的,则抛出异常。

      【讨论】:

        【解决方案4】:

        我会支持上述答案。另外对于create,不能将false 作为参数传递,而save 则可以这样做。将 false 作为参数传递将跳过所有 Rails 验证

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-20
          • 1970-01-01
          • 2016-11-21
          • 2021-08-10
          • 1970-01-01
          • 2013-04-17
          • 2010-09-05
          • 1970-01-01
          相关资源
          最近更新 更多