まず、この:
def format_values
self.profit.to_s.delete!('^0-9') unless self.profit.nil?
end
はかなりこれと同じです。
def format_values
return if(self.profit.nil?)
p = self.profit
s = p.to_s
s.delete!('^0-9')
end
format_values
メソッドは、self.profit
に何か影響を及ぼすとは限りません。
はもちろん変更format_values
のself.profit
に加工した文字列を割り当てることができますが、あなたのクレンジング・ロジックが間違った場所にあるので、それは助けにはなりませんし、それが'$1,000'
がゼロになってきた後に実行されます。
プロパティに値を割り当てると、ActiveRecordは途中でいくつかの型変換を適用します。 '$1,000'
を番号に変換しようとするとどうなりますか?あなたはもちろんゼロを得ます。コンソールで遊ぶ場合は、この出来事を見ることができます:
> 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
をだから、あなたのデータのクリーンアップがあるため、すぐにARが値にその手を取得するように、データがモデルのインスタンスに入る前に行わを取るために持っています'$1,000'
は0
になり、すべてが失われます。私はコントローラーにロジックを入れ、コントローラーの仕事は外界とモデルとデータフォーマットとメディエーションの間の仲介であり、確かにメディエーションとしてカウントされます。つまり、あなたのコントローラ内でこのような何かを持っている可能性があり:
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
ActiveRecordのは、あなたのデータにその汚い小さな手を取得し、物事の混乱を作る前に、そして、すべてがきれいになります。
モデル内でprofit=
メソッドをオーバーライドすることで同様のことができますが、それは実際にモデルの仕事ではありません。
/[^ 0-9] /は、\ D/ – makaroni4
と同じです。著者のRegExpを模倣するだけです。彼を怖がらせようとしないで) – jdoe
ありがとう@jdoe私はあなたの提案を使用して、それが私が望むように動作します。 –