To jest niejasno powiązane z: How to Update all Dates in a Table Ale tylko, jeśli zmrużysz oczy naprawdę mocno.Rails 3 update_all przy użyciu danych już zawartych w tabeli na podstawie jednego rekordu
Część 1 - Wiem, że SQL może aktualizować jedną kolumnę w tabeli na podstawie formuły, która obejmuje inne kolumny w tej samej tabeli. I można to zrobić za pomocą jednego, prostego wiersza SQL w następujący sposób:
UPDATE thieving_prices SET current_price = (1 + usury_rate) * current_price;
Teraz wszystkie ceny zostały właśnie wędrowaliśmy przez ich różnych powiązanych stóp nikczemnej.
Część 2 - Wiem też, że Rails 3 oferuje wspaniały kawałek magii nazywany update_all który tworzy zapytanie UPDATE za pomocą pojedynczej linii SQL:
ThievingPrice.update_all(:current_price = 35000.00)
generuje:
UPDATE thieving_prices SET current_price = 35000.00;
teraz wszystkie ceny są identyczne dla wszystkich produktów. Bardzo bezużyteczny w tym podstępnym sklepie.
Część 3 - Wszystkie te ceny mają stałą stałą stopę wzrostu i jest jakiś sposób, aby napisać elegancką linię kodu w Rails 3, aby to osiągnąć.
a linia:
ThievingPrice.update_all(:current_price => (1 + :usury_rate) * :current_price)
nie działa. Podobnie jak moje eksperymenty, nie ma żadnej składniowej zmienności z nawiasami, nawiasami lub nawiasami. Na pewno inni natknęli się na potrzebę takiej konstrukcji. Nie chcę, by się znowu na bardzo powolny i marnowania zasobów każdego bloku:
ThievingPrice.each do |tp|
new_price = tp.current_price * (1 + tp.usury_rate)
tp.update_attribute(:current_price => new_price)
end
Przez czas, który kończy swoje
ofiar
patronów opuścił sklep. Jakie są moje opcje?
Czy "ThievingPrice.update_all (" current_price = (1 +?) * Current_price ",: meesury_rate)' fail? – ScottJShea
Nie, próbuje pomnożyć przez ciąg 'usury_rate' –
Ale ponieważ jest oparty na danych, które zostały już zweryfikowane przed zapisaniem w bazie danych, mogę bezpiecznie zmienić sugestię w następujący sposób: ThievingPrice.update_all ("current_price = (1 + # {: usury_rate}) * current_price) i to działa, dziękuję za pomoc w zobaczeniu tego w inny sposób –