2012-03-01 12 views
5

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?

+0

Czy "ThievingPrice.update_all (" current_price = (1 +?) * Current_price ",: meesury_rate)' fail? – ScottJShea

+0

Nie, próbuje pomnożyć przez ciąg 'usury_rate' –

+0

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 –

Odpowiedz

8

Wypróbuj ThievingPrice.update_all("current_price = (1 + ?) * current_price" , :usury_rate). powinien pobrać parametr i pomnożyć aktualną cenę przez tę kwotę w zależności od aktualnie aktualizowanego obiektu.

Powiązane problemy