如果在3.2.13中弃用了ActiveRecord :: Base#create,我仍然如何使用它?

时间:2013-04-10 23:48:27

标签: ruby-on-rails ruby

我正在运行3.2.13并且遵循标准“railstutorial.org”我遇到了一个问题。我仍然处于从C ++ / Java编程思维模式切换的过程中,并试图理解正常的调用约定。

我可以使用我的班级(User < ActiveRecord::Base),如:

User.create(email: "email", password: "password", password_confirmation: "password")

doc for the method表示已弃用。我也没有在ActiveRecord gem源中看到def create的引用。

由于调用没有使用Hash,这种调用的名称是什么?如果参数用大括号括起来是否相同?

2 个答案:

答案 0 :(得分:4)

这里有两个问题。

第一个问题:方法弃用

this commit中进行了更改。

create方法从ActiveRecord::Baseremoved inserted进入名为ActiveRecord::Persistence的单独模块。

关于APIDock告诉你的内容......该方法“已弃用或已移动”。如果您查看建议列表的中间位置,则会看到ActiveRecord::Persistence#create。这是方法移动到的地方。

请注意,ActiveRecord::Persistence#create在内部使用。在应用程序代码中的ActiveRecord 模型(非对象)上调用create时,您正在调用ActiveRecord::Relation#create

ActiveResource::Base#create在Rails 2.0中引入,与ActiveRecord无关。

第二个问题:哈希作为参数

检查ActiveRecord::Relation#create的{​​{3}}会显示以下内容:

# File activerecord/lib/active_record/relation.rb, line 85
def create(*args, &block)
  scoping { @klass.create(*args, &block) }
end

请参阅splat参数*args?这告诉Ruby将所有剩余的参数传递给args,无论有多少。 Ruby / Rails的ducktyping magic看到了一堆键值对,并假设它是一个哈希值。

Rails有点松散,要求在参数中使用大括号括起哈希,就像在括号中包装所有参数一样松散。通常,当您传入一系列键值对时,Rails将推断哈希值。有时这会在传入多个哈希值时导致麻烦,例如在复杂的form_for方法中。

如果您的行为不稳定且没有大括号,请插入它们。明确定义哈希将允许您确保正确的行为。

阅读有关Ruby splats source的更多信息。

答案 1 :(得分:1)

“弃用”并不意味着“不再可用”。这意味着 将很快不再可用。