2011-11-11 22 views
7

Próbuję zbudować aplikację w "sposób szyny", więc tym razem zamiast retrospektywnie przetwarzać rekordy w bazie danych, próbuję zrobić to za pomocą metody before_save, a mianowicie ten:Wyślij parametr do before_save

def make_percentage_from(score) 
    percent = (score.fdiv(20) * 100) 
    return percent 
end 

Każdy element przychodzący do bazy danych ma wynik 20 punktów, zanim zostanie zapisany w bazie danych, ale chciałbym zapisać go jako procent, ale problem, który mam, polega na tym, że nie mogę wysłać atrybutuj dane przez before_save.

Idealnie Musiałbym

before_save: make_percentage_from (wynik-do-obliczony)

Jak mogę to zrobić? Google nie obraca się tak wiele dla mnie i jestem zdeterminowany, nie mogę mieć do przetwarzania tych danych po jego przechowywane (o ile oczywiście nie jest inny sposób!)

Dzięki i pozdrowienia

Geoff

Odpowiedz

9

Jeśli score i percentage są atrybutami Widget:

class Widget < ActiveRecord::Base 
    before_validates :calculate_score_percentage 
    validates :percentage, :presence => true 
private 
    def calculate_score_percentage 
    self.percentage = score.fdiv(20) * 100 
    end 
end 

To działa, ponieważ wszystkie swoje atrybuty/kolumn mają getter i Sette r metody automatycznie definiowane przez ActiveRecord. Odwołanie do metody score w metodzie calculate_score_percentage polega w rzeczywistości na wywołaniu metody self.score, która zwróci obiekt/wartość score. Musimy jawnie użyć self.percentage, ponieważ byłoby niejednoznaczne korzystanie z percent samemu - może to być albo zdefiniowanie lokalnej zmiennej percentage, albo wywołanie self.percentage=. Wartością domyślną byłaby pierwsza, co nie jest tym, czego chcemy w tym przypadku.

Używam before_validates, aby pokazać, że możesz nadal używać sprawdzania poprawności, co jest dobre dla sprawdzania poprawności. Jeśli nie chcesz wykonywać żadnej weryfikacji, możesz zamienić ją na before_save bez żadnych zmian kodu.

+0

Doskonała, dokładna reakcja. –

8

Krótka odpowiedź: wywołania zwrotne nigdy nie mają parametrów. Zakłada się, że wywołania zwrotne podejmują działanie na obiekcie lub sam zapis. Więc wszystko, czego potrzebujesz jako parametr, który musisz przechowywać jako atrybut (który jest zapisany w bazie danych) lub jako zmienną instancji.

Powiązane problemy