我有一个带有Subscription
字段的price
模型,我上一次迁移引入了一个名为per_month_price
的字段。我正在寻找一种方法,它可以比简单的.each {...}
更快地更新记录。例如:
Subscription.update_all {|c| c.per_month_price = c.price/12}
答案 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')
似乎没问题
答案 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
列的功能相同。它会更有效率,因为您不必那么多地访问数据库,并且它消除了price
和per_month_price
列与某个地方彼此不一致的可能性(例如,很可能),例如:如果你更新一个但忘记更新另一个。
很抱歉,我没有直接回答您的问题(特别是对于通过Google访问此处的任何人),但这对我来说似乎是一个更好的设计。