rails更新控制器方法是否仅适用于一个对象?

时间:2011-08-26 18:40:48

标签: ruby-on-rails rest

我经常使用ajax来更新或删除控制器中的对象。现在,有update和destroy方法,它们通常会查找单个id并对其执行操作。但我经常需要对多个对象执行相同的操作。我可以修改更新方法以将ID作为数组获取并循环遍历它们,无论它是一个id还是几个,它将对每个执行相同的操作 - 或者为update_all创建几乎相同的方法。尝试将update用作update_all方法是否明智,还是令人困惑? update_all方法的缺点似乎是代码非常相似,但是为所有代码完成了。

控制器中的更新是否始终适用于一个对象?什么是最佳实践以及人们通常做什么?

2 个答案:

答案 0 :(得分:2)

我不想彻底改变7“开箱即用”行动的概念行为。如果其他人出现并尝试使用该代码,他们可能会对为什么从正常/通常的更新操作行为更改它而感到困惑。相反,我会添加一个描述性的收集路径(update_many或类似的东西)。

另外,你能否抽出公共代码来解决问题?

答案 1 :(得分:0)

您可以在update(查询结果)上调用ActiveRecord::Relation,它会更新所有对象。在引擎盖下,这基本上是一种方便的方法,它执行您描述的循环并调用每个对象的更新。 (参见:docs

还有update_all方法与delete类似,因为它只是将查询发送到数据库。这将使用一个查询更新所有记录。但是,执行任何rails验证或回调。在实践中,这严重限制了该方法对日常编码的有用性。我发现这种方法对特殊脚本中的批量活动更有用。

一些评论:

Rails和ActiveRecord的一个缺点是它的回调模型基于与数据库的单个记录交互。虽然这种编码非常精彩,但它使大批量交易非常繁重。我个人花了很多时间来解决这个问题。在大的,它是值得的其他好处。