2017-10-06 12 views
0

私はいくつかのテーブルデータをRails-Reactアプリケーションで作成しています。Railsに小数点を受け入れるにはどうすればよいですか?

私はコンソールで、ここでデータのこの部分を作成していた:

2.3.3 :024 > Crop.create date: Date.today, cropname: 'Radishes', ismetric: false, bagspackaged: '20', unitweight: '0.5', totalweight: '10' 

今日は、私はRailsは関係なく、私は、コンソールにそれを更新しようかunitweight 0.5小数点を受け入れないとしていないことに気づき、それはしていませんセーブ。

これは私のschema.rbファイルされる:、それは文字列

ActiveRecord::Schema.define(version: 20171004224716) do 

    # These are extensions that must be enabled in order to support this database 
    enable_extension "plpgsql" 

    create_table "crops", force: :cascade do |t| 
    t.date "date" 
    t.string "cropname" 
    t.boolean "ismetric" 
    t.integer "bagspackaged" 
    t.integer "unitweight" 
    t.integer "totalweight" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

end 
+2

'unitweight'は整数として定義されています。それに0.5を割り当てることで、あなたが何を期待しているか分かりません。 – lurker

答えて

1

私は作物のテーブルをロールバックすることは避けたい、それはもっとうまくいくだろう。それはあなた次第です。

やる私はちょうどになります。そのファイル内

rails g migration ChangeUnitweightToFloat 

を、私はそうのように構成します。この2つのステップで

class ChangeUnitweightToFloat < ActiveRecord::Migration 
    def change 
    change_column :crops, :unitweight, :float 
    end 
end 

を、あなたが行くように行くべきです。 将来参照する場合は、小数点以下を扱う場合は、t.decimalまたはt.floatのいずれかになります。

1

小数ではないのです。数値リテラルの周りに引用符を入れないでください。

Crop.create(
    date: Date.today, 
    cropname: 'Radishes', 
    ismetric: false, 
    bagspackaged: 20, 
    unitweight: 0.5, 
    totalweight: 10 
) 
1

あなたが代わりに整数のフィールドを入力しdecimal(またはfloat)使用することができます

2.3.3 :024 > Crop.create date: Date.today, cropname: 'Radishes', ismetric: false, bagspackaged: '20', unitweight: 0.5, totalweight: '10' 
+0

最初の移行をロールバックする必要がありますか? – Ale

+0

その列remove_columnを削除する別の移行をロールバックするか作成してから、精度を指定してadd_column – Cyzanfar

4

2つの問題:その後、

create_table "crops", force: :cascade do |t| 
    t.decimal "unitweight" 
end 

とは、値の周りに引用符を使用しないでくださいここに

  • 最初にデータ型をintegerunitweighttotalweightとし、分数を受け入れて保存するには、decimalまたはfloatと指定する必要があります。 decimal精度の高いデータ型のほうが、コメントの項で後述するように、より正確な結果を得ることができます。 ユーザーdecimalの場合、scale属性でサイズ(桁数)を制御でき、precisionという別の属性で小数点を制御できます。ここ

    が、これはあなたがintegerstringを渡しているこれらの60.00、80.99と100.00

  • セカンドのような小数を保存することができます

    add_column :tickets, :price, :decimal, precision: 2, scale: 5

    例であり、それは問題ではありません有効なintegerである限り、レールはintegerに変換されるため、0になります。しかし、一般的には良いことではありません。

+1

の 'decimal'を指定して新しい列を' float'よりも優先させることができます。 – tadman

+0

@tadman確かに私は彼に両方のオプションを与えているが、あなたは正しいと言っていたはずです。あなたはもう一度書き直す必要はないと言っているからです。 –

+3

もちろん、オプションに問題はありません。 「0.5」が出てくると純粋な浮動小数点数で「0.499999994812」と表示されます。 – tadman

関連する問題