2011-08-05 6 views
3

データベーステーブルにdollarsという整数列があり、データベースに$1000などの値を保存しようとしています。ただし、文字列$1000をドル記号で整数列に保存しようとすると、整数0に自動的に変換されます。整数としてデータベースに保存する前に文字列データを整理する

これを防ぐために、ドル記号を削除するために私のモデルのclean_dataメソッドにbefore_saveコールバックを追加しようとしました。しかし、clean_dataが呼び出される前に、すでにレールに$1000文字列をデータベースに保存しようとしているようです。

データベースに整数として保存する前に、ドル記号を値から削除するほうが良いのでしょうか?ここで

は私のコードです:bids_controller.rbcreateアクションで

、これを実行すると、データベースが正常にフォームから値$1000を保存できるようになります。しかし

# Remove dollar sign 
    if params[:bid][:dollars][0] == "$" 
     params[:bid][:dollars] = params[:bid][:dollars].delete('$') 
    end 

    @bid = Bid.new(params[:bid]) 
    @bid.save 

、私は削除した場合コントローラーのif-endフラグメントを次のようにモデルのデータでクリーニングします。

before_save :clean_data 

    def clean_data 
     puts self.dollars 
     self.dollars = self.dollars.delete('$') 
    end 

0puts self.dollarsには、clean_dataメソッドでドル記号を削除する前に値が取得されます。

私の仮説は、レールが呼ばれclean_dataまたはsaveいずれかの前に、データベース内のデータを「ホールド」しようとしたことで、この「ホールド」整数列ができないので、データが0に変換されますドル記号を保存します。

ありがとうございました! :)

+0

あなたがうまくやっているように聞こえるので、あなたのコードを質問に表示してください。 – lucapette

+0

こんにちは、私はコードを含めるように私の質問を更新しました。助けてくれてありがとう! –

+0

@MingCあなたは解決策を見つけましたか? – Luccas

答えて

0

trの方法を見てください。

"$1000".tr("$", "") # => "1000" 

データベースに保存する前に、文字列変数でこれを行うことができます。

+0

エイプ。私はちょうどコードを含めるように私の質問を更新しました。私の '.delete( '$')'は '.tr'と同じ効果があると思います。ありがとう! –

関連する問題