Rails根据字段值更新多个记录

时间:2013-12-19 11:31:48

标签: ruby-on-rails ruby activerecord orm arel

我有一个带有Subscription字段的price模型,我上一次迁移引入了一个名为per_month_price的字段。我正在寻找一种方法,它可以比简单的.each {...}更快地更新记录。例如:

Subscription.update_all {|c| c.per_month_price = c.price/12}

3 个答案:

答案 0 :(得分:5)

为什么不简单地使用

Subscription.update_all( "per_month_price = price / 12" )

这很有效。它接受语句并运行所有找到的记录。 这在rails中很常见。

http://apidock.com/rails/ActiveRecord/Relation/update_all

请在downvote之前检查!

答案 1 :(得分:1)

您可以尝试在原始sql中执行此操作。我不确定语法是标准SQL,它可能不适用于所有DB

ActiveRecord::Base.connection.execute('UPDATE Subscription SET per_month_price = price / 12')

mySQL

似乎没问题

答案 2 :(得分:0)

也许我错过了一些东西,但是如果可以从现有列以编程方式确定,为什么要将它添加到数据库呢?只需创建一个虚拟属性:

class Subscription < ActiveRecord::Base

  .
  .
  .

  def per_month_price
    self.price / 12
  end

  def per_month_price=(arg)
    self.price = arg*12
  end

end

这与您的数据库中有per_month_price列的功能相同。它会更有效率,因为您不必那么多地访问数据库,并且它消除了priceper_month_price列与某个地方彼此不一致的可能性(例如,很可能),例如:如果你更新一个但忘记更新另一个。

很抱歉,我没有直接回答您的问题(特别是对于通过Google访问此处的任何人),但这对我来说似乎是一个更好的设计。