2013-04-28 3 views
10

3 가지 모델, 사용자, 게임 및 플레이어가 있습니다. 기본적으로 사용자와 게임 간에는 많은 관계가 있습니다. 플레이어는 조인 테이블과 같습니다. 단, 플레이어는 다른 정보를 가지므로 자체 모델이 있습니다.shoulda matchers는 유효 범위가 실패 할 때 validate_uniqueness_of를 실행해야합니다.

플레이어는 게임 ID와 사용자 ID의 독특한 콤보를 필요, 그래서 플레이어에서 말을하려고 : 내 사양에서 다음

validates_uniqueness_of :user_id, :scope => :game_id 

와 나는 (했어야 매처 (matcher)를 사용하여) 말했다 :

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

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

아직 내가 액티브 :: statemen 받고 있어요 :

여기에 플레이어가 정의하는 관계입니다 해당 사양에 주석 오류가 발생했습니다.

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

어떤 문제가 있습니까?

답변

9

known issue입니다. 범위가 지정된 필드가 모델에 종속되어 있고 :null => false으로 설정된 경우이 오류가 발생합니다.

또한, 주위에 방법이이 알려진 문제이지만 rails Column cannot be null:

+0

감사합니다. 그곳에 벌레가 있다는 것을 몰랐습니다. – bdwain

+1

업데이트 :이 문제는 v 2.7에서 수정 될 예정입니다. 참조 : https://github.com/thoughtbot/shoulda-matchers/commit/e3493811865a42b4bebcf0d3001333b9d4cb5208 –

6

를 살펴 않아도됩니다.

처음 레코드를 만든 다음 고유성 유효성 검사를 테스트하면 작동합니다. 대신

그래서, 단순히 당신은

it do 
    FactoryGirl.create(:player) 
    should validate_uniqueness_of(:user_id) 
end 

를 작성할 수

it { should validate_uniqueness_of(:user_id) } 

를 작성하고 고유성 검증 사양 작동합니다.

참조 : http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/frames

+3

또는'validate_uniqueness_of (: value) .scoped_to (: question_id)}'에'it {expect (create (: label) rspec3 구문을 사용하여 하나의 부드러운 선으로. –

1

당신은 here

하나의 솔루션이 공식 소스 코드주의에서 언급 한 문제 및 솔루션에 대해 읽을 수 있습니다

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