Rails 3 update_all использует данные, уже содержащиеся в таблице, для каждой записи - PullRequest
5 голосов
/ 01 марта 2012

Это неопределенно связано с: Как обновить все даты в таблице Но только если ты щуришься очень сильно.

Часть 1. Я знаю, что SQL может обновить один столбец в таблице на основе формулы, которая включает другие столбцы в той же таблице. И это можно сделать с помощью одной простой строки SQL следующим образом:

UPDATE thieving_prices SET current_price = (1 + usury_rate) * current_price;

Теперь все цены были просто подняты из-за их различных злодейских ставок.

Часть 2. Я также знаю, что Rails 3 предлагает чудесную магию под названием update_all, которая создает запрос UPDATE с использованием одной строки SQL:

ThievingPrice.update_all(:current_price = 35000.00)

генерирует:

UPDATE thieving_prices SET current_price = 35000.00;

Теперь все цены одинаковы для всех продуктов. Очень бесполезно в этом подлом магазине.

Часть 3. Все эти цены имеют свои собственные устойчивые темпы роста, и должен быть способ написать элегантную строку кода в Rails 3 для достижения этой цели.

И строка:

ThievingPrice.update_all(:current_price => (1 + :usury_rate) * :current_price)

не работает. Как и мои эксперименты, никаких синтаксических изменений, связанных с круглыми скобками, скобками или скобками, - нет. Конечно, другие сталкивались с необходимостью такой конструкции. Я не хочу останавливаться на невероятно медленном и тратящем ресурсы каждом блоке:

ThievingPrice.each do |tp|
  new_price = tp.current_price * (1 + tp.usury_rate)
  tp.update_attribute(:current_price => new_price)
end

К тому времени, когда заканчиваются мои жертвы покровителей уже покинули магазин. Какие у меня варианты?

1 Ответ

8 голосов
/ 01 марта 2012

Попробуйте ThievingPrice.update_all("current_price = (1 + ?) * current_price" , :usury_rate). он должен взять параметр и умножить текущую цену на эту сумму на основе объекта, который обновляется в данный момент.

...