【问题标题】:Is the rails update controller method expected to be for one object only?rails update 控制器方法是否预计仅适用于一个对象?
【发布时间】:2011-11-04 18:25:24
【问题描述】:

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

控制器中的更新是否总是针对一个对象?最佳做法是什么?人们通常会做什么?

【问题讨论】:

  • 你是指模型上的ActiveRecordupdate方法,还是生成脚手架时在控制器中创建的update方法?听起来您的意思可能是后者,但还不清楚。
  • 啊对不起,控制器中的方法。

标签: ruby-on-rails rest


【解决方案1】:

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

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

一些评论:

Rails 和 ActiveRecord 的缺点之一是它的回调模型基于与数据库的单记录交互。虽然这使得编码非常美妙,但它使大批量交易变得非常繁重。我个人花了很多时间来解决(或解决)这个缺点。总的来说,为了其他好处,这是值得的。

【讨论】:

  • 我想你可能也被我的帖子弄糊涂了。我更一般地谈论控制器中的更新方法,而不是直接在对象上更新。除非我误解了你的回答。
【解决方案2】:

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

另外,你能抽象出通用代码来干吗?

【讨论】:

  • 我也在沿着这些思路思考——主要的 7 个动作似乎应该基本上保持不变。还在考虑重复代码......我认为它可能只是初始查询然后更新本身,尽管可能会发生改变(渲染部分)的后续 js 可能被抽象出来。
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 2018-01-14
  • 2018-01-18
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多