如果 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 =?
为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?
dynamic_matchers.rb:55:in `method_missing':ActiveRecord::Base:Class 的未定义方法 `migration_error=' (NoMet