如何解决为什么我不能在Rails中使用Record.all.destroy?
| 我目前正在学习Ruby和Ruby on Rails框架。我发现在表ѭ0中,我可以找到一个ID为5的记录,并使用以下代码将其删除:Record.find(5).destroy
这很有意义-我用链式方法找到记录并销毁它。但是,如果要销毁表中的所有记录,则逻辑命令将如下所示,因为all
选择器会选择表中的所有记录:
Record.all.destroy
这将返回NoMethodError!我知道我可以使用Record.destroy_all
或Record.delete_all
完成此任务,但是,我想知道为什么我不能只使用最合逻辑的选择,而不必查找like6ѭ之类的东西。我是这个框架的新手,所以很可能在这里缺少一些基本的东西。
感谢您提前提出任何答案。
解决方法
这是一个设计决定。 DataMapper采用了您的方法。被迫显式编写
destroy_all
可能很乏味,但也会阻止您执行您真正不想要的事情(即删除表中的所有内容,例如x = User; ...; x.destroy
)。
, 我同意能够做到这一点是合乎逻辑的。从技术上讲,ѭ9返回一个未实现destroy
方法的集合(或集合的代理)。
, 当你有
Record.find(5)
这将返回一个Record对象/实例,它代表表中一行中的数据。然后,在由Record模型定义的对象上调用#destroy方法。
当你有
Record.all
这将返回一个Array对象。为了让您随后在数组上调用#destroy,您必须对Ruby \的核心Array类进行修补才能拥有#destroy方法。
, 避免Record.destroy_all
的最简单方法是Record.all.each {|r| r.destroy}
。这可能会满足您的API设计偏好,但比第一个选项要慢得多。
, 实际上,您可以(以某种方式)。由于ѭ15返回一个数组,而不是活动记录关系,因此您将要删除什么?我不会说Record.all.destroy完全合乎逻辑-您要删除数组对象吗?
您可以做的一件事是映射结果数组,由于map
接受proc(&
),因此可以对数组中的每个对象执行该proc。
Record.all.map(&:destroy)
注意,这将触发所有对象上的回调,这可能比预期的要慢。如果要避免触发回调,则可以映射适当的破坏性方法,而不是使用destroy方法。 (提示::delete)
或者,您可以执行以下操作:
Record.destroy_all or Record.delete_all
如您在问题中所述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。