5

私はPostGreデータベースでRails 4.2.3を使用しています。データベースの列にミリ秒数を格納する必要があります。メモはタイムスタンプではなく、ミリ秒単位の期間です。だから私は、しかし、私はRailsの中に値を格納するために行くとき、私はそれが数を思わ以下のエラーに"値" 3000002000が "整数型の範囲外です"

ActiveRecord::StatementInvalid (PG::NumericValueOutOfRange: ERROR: value "3000002000" is out of range for type integer 
: INSERT INTO "my_object_times" ("time_in_ms", "my_object_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"): 
    app/controllers/my_objects_controller.rb:31:in `update' 

を取得し、「3000002000」がより小さくなるので、

time_in_ms | bigint 

ように私のコラムを作成しました私が読んでいる列の最大値は "9223372036854775807"なので、他に何がうまくいかず、どうやって修正できるのか不思議です。

編集:追加情報を提供するために、私のdb/schema.rbファイルで、問題の列がthusly記述されている...

create_table "my_object_times", force: :cascade do |t| 
    ... 
    t.integer "time_in_ms",  limit: 8 

編集2:ここでは、作成の出力でありますPSQLのテーブル

CREATE TABLE my_object_times (
    id integer NOT NULL, 
    first_name character varying, 
    last_name character varying, 
    time_in_ms bigint, 
    created_at timestamp without time zone NOT NULL, 
    updated_at timestamp without time zone NOT NULL, 
    name character varying, 
    age integer, 
    city character varying, 
    state_id integer, 
    country_id integer, 
    overall_rank integer, 
    age_group_rank integer, 
    gender_rank integer 
); 
+1

schema.rbファイルの列データ型をもう一度チェックしますか? –

+2

エラーメッセージは、列が実際には「int」であることを示しています。あなたの 'schema.rb'は何を言わなければなりませんか? '\ d my_object_times'は' psql'の中から何を言いますか? –

+2

サイドノートでは、 'bigint'ではなく、' interval'データ型で持続時間を格納する必要があります。 'bigint'のように、内部的には64ビットの整数ですが、' interval'を使うと意味的に便利で、あらゆる種類の便利な演算子にアクセスできます。 –

答えて

5

を実行しますその代わりに、スキーマと移行ファイルがbigintとして指定しても

は、たとえば:整数bigint型を作るために8要件:私は

class CreateSecureUserTokens < ActiveRecord::Migration 
    def change 
    create_table :secure_user_tokens do |t| 
     t.integer :sso_id, null: false, length: 8 
     t.string :token, null: false 

     t.timestamps null: false 
    end 
    end 
end 

注この移行ファイルを有し、それが含まれる長さを有しています。しかし、移行を実行した後、私はあなたと同じ問題を抱えていました。結局のところ、問題を解決しようとする別の移行を作成しただけです。ここで私は問題を解決するために使用移行です:

class ModifySecureTokensForLargerSsoIdSizes < ActiveRecord::Migration 
    def change 
    change_column :secure_user_tokens, :sso_id, :integer, limit: 8 
    end 
end 

私たちはあなたのニーズに合わせてそれを変更するのであれば、それは次のようになります。

class ObjectTimesBigInt < ActiveRecord::Migration 
    def change 
    change_column :my_object_times, :time_in_ms, :integer, limit: 8 
    end 
end 

助けホープ! -Charlie

-4

は64ビットですが、Railsは32ビットです。

3000002000は、2^32より大きい。そのため、32ビット整数に変換するのはNumericValueOutOfRangeで失敗します。

+1

?エラーメッセージは、データベースが不平を言っていることを示唆しており、OPが64ビットの 'bigint'として列を作成したと主張しています。 –

+0

@muistooshort 'PG :: NumericValueOutOfRange' - レンジ関連の変換の問題であることを示しています。私の答えで説明した問題です。) –

+1

エラーはデータベースではなくRailsからのものです。 Rubyは必要に応じて整数をbignumにアップグレードします。とにかくこれが2016年であることを見て、使用しているRubyはほぼ確実に64ビットです。 –

1

編集:私はちょうどこれを再読み込み、私の元の答えは実際にあなたのケースでは意味がありません。私はあなたが回答のためにそのコラムの外を見る必要があると信じています、そして、はあなたがそれの状態について知っていると思うものすべてを手動で確認します、。詳細を追加することで、正しい答えを見つけるのに役立ちます。 T | |やるカスケード: ブレークポイントを設定し、リクエストをステップとあなたがinteger

CREATE_TABLE「my_object_times」、力を見つけることができるかどうかを確認するには: ... t.integer "time_in_ms"、リミット:8

t.integer - これは私にはあなたの犯人のように見えます。 ... 私は最後に、何らかのRails要求ミドルウェアに関連していなければならないと考えましたが、具体的な内容が分からないのです。要求パスの何かは、その列が整数だと考えます。これまでRailsの移行データ型がどのように機能していたのか分かりませんでした。 (そして、私は一日中釣りに行ったので、この日は勝利を数えます)。幸運を祈る!

+0

私はあなたがしたいことを理解していません。 woudlが助ける追加情報 – Dave

+1

正直に分かりませんが、私は自分のやりたいことを考えようとしています。データスキーマがtime_in_millisecondsの実際のDB列にbigintを表示していることを確認したいと思います。エラーメッセージは明らかにシステムの一部を示しています(私はレールのエキスパートではありませんが、Active Recordはそれがそうであるように見えます)。値は整数でなければならないと信じています... あなたのモデル、シード、 PostGreからのテーブル構造の出力、多分? –

+0

私は私の質問にdb/schema.rbを含めました。私の質問にはPostGresdbの "\ d my_object_times"定義が含まれていました。 – Dave

1

テーブルmy_object_timesschema.rbファイルから作成されていないか、他の移行ファイルで上書きされている可能性があります。ため、マイグレーションファイルでは、制限8の整数列自体はbigintです。したがって、PG管理者からテーブル定義をクロスチェックする必要があります。カラムがBIGINTでない場合、私は私が最初のモデルは、それが整数であると考え、何らかの理由で、デシベルでBIGINTフィールドを作成しようとすると、どこの前に、それは私に起こる持っていた次の移行

class ChangeTimeInMsToBigint < ActiveRecord::Migration 
    def change 
    execute <<-SQL 
    ALTER TABLE my_object_times 
    ALTER COLUMN time_in_ms TYPE bigint USING time_in_ms::bigint 
    SQL 
end 
end 
関連する問題