2012-03-01 13 views
5

Bu, belli belirsiz: How to Update all Dates in a Table Ancak, sadece çok sert şaşıyorsanız.Rails 3 update_all Tabloda zaten mevcut olan verileri kullanarak kayıt bazında

Bölüm 1 - SQL'in, bir tablodaki aynı sütunda bulunan diğer sütunları içeren bir formül temelinde bir sütunu güncelleyebileceğini biliyorum.

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

Şimdi tüm fiyatlar sadece onların çeşitli ilişkili iğrenç oranlarıyla yükseltti edilmiştir: aşağıdaki gibi Ve SQL tek ve basit bir çizgi ile yapılabilir. Şimdi

UPDATE thieving_prices SET current_price = 35000.00; 

:

ThievingPrice.update_all(:current_price = 35000.00) 

oluşturur: -

Bölüm 2 Ben de Raylar 3 sihirli harika biraz SQL tek bir satır kullanarak UPDATE sorgusu yaratan update_all denilen sunduğunu biliyoruz Tüm ürünler için tüm fiyatlar aynıdır. Bu sinsi mağazada çok işe yaramaz.

Bölüm 3 - Tüm bu fiyatların kendi sabit oranlı artışları var ve bunu başarmak için Rails 3'te zarif bir kod satırı yazmanın bir yolu var.

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

çalışmaz. Ayrıca, deneylerimin gösterdiği kadarıyla parantez, parantez veya parantez içeren sözdizimsel bir varyasyon da yoktur. Elbette başkaları böyle bir yapıya ihtiyaç duymaktadır. Ben inanılmaz derecede yavaş ve kaynak israf her blokta geri düşmek istemiyorum: müşterilerin mağazayı bırakmış benim kurbanları bitirir Zamanla

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

. Seçeneklerim nelerdir?

+0

'ThievingPrice.update_all (" current_price = (1 +?) * Current_price ",: usury_rate)' başarısız? – ScottJShea

+0

Hayır, 'usury_rate' dizesiyle çoğaltmaya çalışır. –

+0

Ancak, veritabanında depolanmadan önce doğrulanmış olan verilere dayandığından, önerinizi aşağıdaki gibi güvenli bir şekilde değiştirebilirim: ThievingPrice.update_all ("current_price =" (1 + # {: usury_rate}) * current_price) ve bu işe yaramıyor Farklı bir şekilde görmeme yardımcı olduğunuz için teşekkür ederim. –

cevap

8

ThievingPrice.update_all("current_price = (1 + ?) * current_price" , :usury_rate)'u deneyin. Parametreyi almalı ve şu anki fiyatını o anda güncellenen nesneye göre o miktarda çarpmalıdır.