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

Posted

技术标签:

【中文标题】如果 ActiveRecord::Base#create 在 3.2.13 中已被弃用,我仍然如何使用它?【英文标题】:If ActiveRecord::Base#create is deprecated in 3.2.13, how am I using it still? 【发布时间】:2013-04-03 00:58:47 【问题描述】:

我正在运行 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 的引用。

由于调用没有使用哈希,这种调用的名称是什么?如果参数用大括号括起来,是否一样?

【问题讨论】:

据我了解,它刚刚从ActiveRecord::Base 移动到ActiveResource::Base。请参阅 apidock.com/rails/ActiveResource/Base/create/class 这仍然是 Hash,但使用新的 Ruby 1.9 语法。 我也是这么想的……但我找不到从 ActiveRecord 到 ActiveResource 的“线”。我的基本理解是我未能从 ActiveRecord 中发现 ActiveResource“导入”。 ActiveResource 是完全不同的东西!!! ActiveResource 用于与 REST 服务交互,但 API 类似于 ActiveRecord。它已从 Rails 中删除,现在您必须将其添加到您的 gem 中才能使用它。 【参考方案1】:

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

【讨论】:

我确实知道“已弃用”是什么意思...这就是为什么我提到我无法在已安装的 gem 的源代码中找到定义的原因。 :D 文档说“此方法已被弃用或在最新的稳定版本上移动。此处显示了最新的现有版本 (v3.1.0)。”。 +1。弃用意味着某些内容已停止使用,将来会被删除,因此您不应该实施它,或者如果已经实施,则应该替换它。 弃用定义和含义理解!!!现在 ActiveRecord::Base#create 的替代品在哪里? :)【参考方案2】:

这里有两个问题。

第一个问题:方法弃用

在this commit 中进行了更改。

create 方法是 removed 从 ActiveRecord::Base 和 inserted 到一个名为 ActiveRecord::Persistence 的单独模块。

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

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

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

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

检查source 中的ActiveRecord::Relation#create 显示以下内容:

# 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 的鸭式输入法会看到一堆键值对并假设它是一个哈希。

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

如果您在缺少大括号的情况下出现异常行为,请插入它们。明确定义散列将允许您确保正确的行为。

阅读更多关于 Ruby splats here.

【讨论】:

以上是关于如果 ActiveRecord::Base#create 在 3.2.13 中已被弃用,我仍然如何使用它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rails 5 使用 ApplicationRecord 而不是 ActiveRecord::Base?

导致弃用警告的原因是:ActiveRecord :: Base.raise_in_transactional_callbacks =?

覆盖ActiveRecord子类中的'=='方法有意义吗?

为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?

dynamic_matchers.rb:55:in `method_missing':ActiveRecord::Base:Class 的未定义方法 `migration_error=' (NoMet

导致 ActiveRecord 记录器 IOError 的 Ruby 守护进程