在 ruby 和 rails 中调用 create 和 new() 的区别
difference between calling create and new() in ruby with rails
假设我有一个 class Try
。然后我试图创建它的对象以在 rspec 文件中的示例之一中使用它。
我尝试编写 let(:obj){obj = Try.new()}
然后在示例中访问它,但出现错误。然而,当我写 llet(:obj){obj = Try.create}
时,我可以使用 obj
并调用它的函数而不会出现任何错误。
我在 rspec 文件中写 Try.create
和 Try.new()
有什么区别?
来自 ActiveRecord::Base 文档:
create(attributes = nil) {|object| ...}
如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库中。无论对象是否成功保存到数据库,都会返回结果对象。
new(attributes = nil) {|self if block_given?| ...}
新对象可以实例化为空(不传递构造参数)或预先设置属性但尚未保存(传递键名与关联的 table 列名匹配的散列)。在这两种情况下,有效的属性键都由关联的 table 的列名决定——因此你不能拥有不属于 table 列的属性。
因此 create 实例化新对象,对其进行验证,然后将其保存到数据库中。并且 new 只创建本地对象,但不会尝试验证或将其保存到数据库中。
假设我有一个 class Try
。然后我试图创建它的对象以在 rspec 文件中的示例之一中使用它。
我尝试编写 let(:obj){obj = Try.new()}
然后在示例中访问它,但出现错误。然而,当我写 llet(:obj){obj = Try.create}
时,我可以使用 obj
并调用它的函数而不会出现任何错误。
我在 rspec 文件中写 Try.create
和 Try.new()
有什么区别?
来自 ActiveRecord::Base 文档:
create(attributes = nil) {|object| ...}
如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库中。无论对象是否成功保存到数据库,都会返回结果对象。
new(attributes = nil) {|self if block_given?| ...}
新对象可以实例化为空(不传递构造参数)或预先设置属性但尚未保存(传递键名与关联的 table 列名匹配的散列)。在这两种情况下,有效的属性键都由关联的 table 的列名决定——因此你不能拥有不属于 table 列的属性。 因此 create 实例化新对象,对其进行验证,然后将其保存到数据库中。并且 new 只创建本地对象,但不会尝试验证或将其保存到数据库中。