1

どこに問題があるのか​​正確にはわかりませんが、(一般的な) ジョーク (モデル) を作成しようとすると、次のエラーが発生します。

ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '2147483647' for key   'PRIMARY': INSERT INTO `jokes` (`content`, `created_at`, `id`, `rating`, `updated_at`) VALUES ('dsfgdsfgdfgd', '2013-02-27 16:33:12', 90650754896700, 0, '2013-02-27 16:33:12')):
  app/controllers/jokes_controller.rb:141:in `create'
  app/controllers/jokes_controller.rb:140:in `create'

そして、別のものを保存しようとすると:

ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '2147483647' for key 'PRIMARY': INSERT INTO `jokes` (`content`, `created_at`, `id`, `rating`, `updated_at`) VALUES ('dsfgdsfg', '2013-02-27 16:32:23', 29733688655250, 0, '2013-02-27 16:32:23')):
  app/controllers/jokes_controller.rb:141:in `create'
  app/controllers/jokes_controller.rb:140:in `create'

このエラーは、エントリが重複していることを示しています (主キー 2147483647)。私はこれまでに 1 つのジョークしか作成できません。展開する前にこの問題は一度もありませんでした。変更された唯一の注目すべき点は、データベースの種類が sqlite3 から mysql2 に変わったことです。

以下は、私のジョーク モデルの重要なコード ビットです。

before_create :randomize_id
#...
validates :content, :presence   => true
validates :content, :uniqueness => true
#...
  private
def randomize_id
begin
  self.id = SecureRandom.random_number(100_000_000_000_000)
end while Joke.where(:id => self.id).exists?
end
4

1 に答える 1

2

キーが大きすぎます。その ID フィールドには 32 ビット (符号付き) 整数のみを入れることができます。独自の主キーを作成しようとしている理由はわかりませんが、とにかく、これを試してください:

  self.id = SecureRandom.random_number(1000_000_000)

ちなみに (2^32)/2 -1 = 2147483647

于 2013-02-27T16:51:12.590 に答える