12

ユーザー、ゲーム、プレーヤーの 3 つのモデルがあります。基本的に、ユーザーとゲームの間には多対多の関係があり、プレイヤーは参加テーブルとして使用されますが、プレイヤーには他の情報があるため、独自のモデルがあります。

プレーヤーにはゲーム ID とユーザー ID の一意の組み合わせが必要なので、プレーヤーで次のように言いました。

validates_uniqueness_of :user_id, :scope => :game_id

そして、私の仕様で、私は言いました(shouldaマッチャーを使用して):

it { should validate_uniqueness_of(:user_id).scoped_to(:game_id)}

プレーヤーが定義する関係は次のとおりです。

belongs_to :game, :inverse_of => :players
belongs_to :user, :inverse_of => :players

それでも、その仕様で ActiveRecord::statementinvalid エラーが発生します

ActiveRecord::StatementInvalid: Mysql2::Error: Column 'game_id' cannot be null: INSERT INTO `players` ETC...

何がうまくいかないのですか?

4

4 に答える 4

9

これは既知の問題です。スコープ フィールドがモデルに依存し、 にも設定されている場合、このエラーが発生し:null => falseます。

また、rails Column cannot be null を見てください:

于 2013-04-28T21:55:04.300 に答える
1

公式のソース コードに関する警告に記載されている問題と解決策については、こちらを参照してください。

1つの解決策は次のとおりです。

describe Player do
  describe "validations" do
    it do
      expect(Player.new(game_id: 1)).
        to validate_uniqueness_of(:user_id).
        scoped_to(:game_id)
    end
  end
end
于 2015-01-07T19:16:22.623 に答える