Przede wszystkim, to:
def format_values
self.profit.to_s.delete!('^0-9') unless self.profit.nil?
end
jest prawie taki sam, jak ten:
def format_values
return if(self.profit.nil?)
p = self.profit
s = p.to_s
s.delete!('^0-9')
end
Nie ma powodu, aby oczekiwać, że Twoja metoda format_values
będzie miała jakikolwiek wpływ na self.profit
.
Można oczywiście zmianie format_values
przypisać przetworzony ciąg self.profit
ale to nie pomoże, ponieważ logika czyszcząc jest w niewłaściwym miejscu i będzie on wykonywany po'$1,000'
został przekształcony w zera.
Po przypisaniu wartości do właściwości, ActiveRecord zastosuje po drodze pewne konwersje typów. Co stanie się, gdy spróbujesz przekonwertować numer '$1,000'
? Oczywiście otrzymasz zero. Można oglądać takiej sytuacji, jeśli bawić się w konsoli:
> a = M.find(id)
> puts a.some_number
11
> a.some_number = 'pancakes'
=> "pancakes"
> puts a.some_number
0
> a.some_number = '$1,000'
=> "1,000"
> puts a.some_number
0
> a.some_number = '1000'
=> "1000"
> puts a.some_number
1000
Więc twój czyszczenia danych musi odbywać przed dane idzie do instancji modelu bo jak tylko AR dostaje jego ręki na wartości , Twój '$1,000'
stanie się 0
i wszystko zniknie. Położyłbym logikę w kontrolerze, zadaniem kontrolera jest pośredniczenie między światem zewnętrznym a modelami i formatowaniem danych, a mangling z pewnością liczy się jako mediacja. Więc można mieć coś takiego w swoim kontrolerze:
def some_controller
fix_numbers_in(:profit)
# assign from params as usual...
end
private
def fix_numbers_in(*which)
which.select { |p| params.has_key?(p) }.each do |p|
params[p] = params[p].gsub(/\D/, '') # Or whatever works for you
end
end
Wtedy wszystko będzie czyste przed ActiveRecord dostaje swoje brudne rączki na danych i robi bałaganu.
Można zrobić podobne rzeczy, przesuwając metodę profit=
w modelu, ale to naprawdę nie jest praca modelu.
/[^ 0-9]/jest taki sam jak/\ D/ – makaroni4
Po prostu naśladuje RegExp autora. Staram się go nie przerażać) – jdoe
dzięki @jdoe użyłem twojej sugestii i działa tak, jakbym tego chciał. –