0
我有以下(過於昂貴分貝)方法:使用獨立值更新多個記錄的有效方法?
def reorder_area_routes_by_demographics!
self.area_routes.joins(:route).order(self.demo_criteria, :proximity_rank).readonly(false).each_with_index do |area_route, i|
area_route.update_attributes(match_rank: i)
end
end
但是這會導致對每個area_route的UPDATE查詢。有沒有辦法在一個查詢中做到這一點?
- 編輯 -
最終的解決方案,每coreyward建議:
def reorder_area_routes_by_demographics!
sorted_ids = area_routes.joins(:route).order(self.demo_criteria, :proximity_rank).pluck(:'area_routes.id')
AreaRoute.update_all [efficient_sort_sql(sorted_ids), *sorted_ids], {id: sorted_ids}
end
def efficient_sort_sql(sorted_ids, offset=0)
offset.upto(offset + sorted_ids.count - 1).inject('match_rank = CASE id ') do |sql, i|
sql << "WHEN ? THEN #{id} "
end << 'END'
end
如果您更新表的新數據位於數據庫中,則可以在db上運行查詢以在一個事務中更新'area_route'中的所有值。這將比逐行更新行更快。我不熟悉Ruby,所以如果你可以將語句翻譯成SQL或者告訴邏輯,那麼我可以給你寫這個SQL。 – Stoleg