Ruby on rails 为什么可以';我不能在Rails中使用Record.all.destroy吗?

Ruby on rails 为什么可以';我不能在Rails中使用Record.all.destroy吗?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我现在开始学习Ruby和RubyonRails框架。我发现在表记录中,我可以找到id为5的记录,并使用以下代码将其删除: 记录.查找(5).销毁 这是有意义的-我使用链式方法查找记录并销毁它。但是,如果要销毁表中的所有记录,逻辑命令如下所示,因为all选择器选择表中的所有记录: Record.all.destroy 这会返回一个NoMethodError!我知道我可以使用Record.destroy\u all或Record.delete\u all来完成这项任务,但是,我想知道为什么我不能只使

我现在开始学习Ruby和RubyonRails框架。我发现在表
记录
中,我可以找到id为5的记录,并使用以下代码将其删除:

记录.查找(5).销毁

这是有意义的-我使用链式方法查找记录并销毁它。但是,如果要销毁表中的所有记录,逻辑命令如下所示,因为
all
选择器选择表中的所有记录:

Record.all.destroy

这会返回一个NoMethodError!我知道我可以使用
Record.destroy\u all
Record.delete\u all
来完成这项任务,但是,我想知道为什么我不能只使用最合理的选择,而不必查找
delete\u all
之类的内容。我是这个框架的新手,所以我完全有可能在这里遗漏了一些基本的东西


感谢您提前给出答案。

这是一项设计决策。数据映射器进行了测试。被迫显式地编写
destroy\u all
可能会很乏味,但也会阻止你做一些你真正不想做的事情(即删除表中的所有内容,如
x=User;…;x.destroy
)。

我同意这样做是合乎逻辑的。从技术上讲,
Record.all
返回一个集合(或集合的代理),该集合不实现
destroy
方法

Record.find(5)
Record.all
这将返回一个记录对象/实例,它表示表中某一行中的数据。然后对记录模型定义的对象调用#destroy方法

当你有

Record.find(5)
Record.all

这将返回一个数组对象。为了让您在数组上调用#destroy,您必须使用monkey patch Ruby的核心数组类来使用#destroy方法。

避免录制的最简单方法是
Record.all
。这可能在某种程度上满足您的API设计偏好,但应该比第一个选项慢得多。

实际上您可以(在某种程度上)。既然
.all
返回一个数组,而不是一个活动记录关系,那么您到底要删除什么?我不会说Record.all.destroy是符合逻辑的——您要删除数组对象吗

可以做的一件事是映射结果数组,因为
map
接受一个proc(
&
),所以可以对数组中的每个对象执行该proc

Record.all.map(&:destroy)
注意,这将触发对所有对象的回调,这可能比您预期的慢。如果希望避免触发回调,可以映射适当的破坏性方法,而不是销毁。(提示::删除)

或者,您可以执行以下操作:

Record.destroy_all or Record.delete_all

正如你在问题中所说的。

的确是个好问题,因为我先尝试了同样的事情。。。当然,你可以使用
Record.all.each{r | r.destroy}
,但这并不像
Record.all.destroy
那样合乎逻辑,谢谢-这就是我想要的答案。我想这可能是一个很好的保护措施,防止意外的大量删除记录。是和否。。。由于ruby的动态特性,rails本身可以在记录数组中插入销毁操作,而无需对所有数组对象进行修补。。。但我认为这是一个设计决定,不这样做。