.build,.create和.create之间的区别!以及何时应使用它们?


167

因此,我一直看到人们使用.build,.create和.create!在他们的控制者中越来越近。与仅使用.new和passig param'd对象然后使用.save有什么区别?有利弊吗?使用这些其他方法是否有好处?

Answers:


233

有几个区别,但差异不大:

  1. .create相当于.new接着.save。这只是更简洁。
  2. .create!等于.new后跟.save!(如果保存失败,将引发错误)。也只是短一点
  3. 我认为.build主要的别名.new。它在Rails 3中以一种方式工作,在Rails <3.x中以另一种方式工作。

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


1
我之所以选择此答案为最正确的答案,是因为提到了能够将关联的模型与它们链接在一起的问题–与使用.new和.save相比,这是一个有趣而重要的区别。这需要一些额外的工作。谢谢。
蒂姆·奈特

11
对3的次要说明-构建不仅仅只是新的-还设置了关联链接。
两位大佬

116
生成与新建不同。但是区别不在于它设置了关联链接(New对于新实例也是如此)。区别在于Build使用新实例填充调用方,而New不填充新实例。因此,例如:Wall.posts.new为您提供了与Wall关联的新帖子,但此调用后Wall.posts仍然为空。Wall.posts.build为您提供了与Wall关联的新帖子,而Wall.posts现在其中有一个帖子。
阿敏·阿里亚纳

3
现在不只是别名,没有特殊功能吗?
加布里埃尔·西鲁里

14
在Rails 4中,我只是在控制台中签到。wall.posts.new和wall.posts.build都以完全相同的方式填充wall对象。如Amin的评论所述,wall.posts.new之后的意思是wall.posts不为空。
Bot 2014年

35

尽管create调用正确,new然后save两个选择的返回值之间却有很大差异。

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

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

如果create与分支逻辑一起使用,则存在静默失败的风险,而使用new+ 则不会save

create! 不会遇到引发的相同问题,并且如果记录无效,则不会出现异常。

create其中替代可以在控制器有用respond_with用于API(JSON / XML)应答。在这种情况下,对象上存在错误将导致错误在状态为的响应中返回unprocessable_entity,而这恰恰是您要从API获得的。

我将始终对HTML 使用new+ save选项,尤其是如果您依赖流控制的返回值。


6

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.