2013-04-28 10 views
10

Ich habe 3 Modelle, Benutzer, Spiel und Player. Es gibt im Grunde eine Viele-zu-Viele-Beziehung zwischen Benutzern und Spielen, mit Spielern als Join-Tabelle, außer dass die Spieler andere Informationen haben, also hat sie ein eigenes Modell.sotaa matchers sollte validate_uniqueness_of mit dem Bereich

Ein Spieler eine einzigartige Kombination aus Spiel und Benutzer-ID benötigt, so habe ich versucht, in Spieler zu sagen:

validates_uniqueness_of :user_id, :scope => :game_id 

und dann in meinem spec, sagte ich (shoulda Matcher verwenden):

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

hier sind die Beziehungen der Spieler definiert:

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

noch Positionspapier ich erhalte eine Activerecord :: tinvalid Fehler auf der Spezifikation

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

Irgendeine Idee, was schief läuft?

Antwort

9

Es ist ein known issue. Dieser Fehler tritt auf, wenn das Bereichsfeld vom Modell abhängig ist und ebenfalls auf :null => false gesetzt ist.

Auch tun sich auch rails Column cannot be null:

+0

Dank. wusste nicht, dass der Bug da war. – bdwain

+1

Update: Dies wird in v 2.7 behoben werden. Siehe: https://github.com/thoughtbot/shoulda-matchers/commit/e3493811865a42b4bebcf0d3001333b9d4cb5208 –

6

Während dies ein bekanntes Problem ist, gibt es eine Möglichkeit, um es ist.

Wenn Sie zuerst einen Datensatz erstellen und dann die Eindeutigkeitsprüfung testen, wird es funktionieren.

Also, statt einfach von

it { should validate_uniqueness_of(:user_id) } 

Schreiben Sie

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

schreiben und die Einzigartigkeit Validierung spec funktioniert.

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

+3

oder 'it {expect (create (: label)). To validate_uniqueness_of (: value) .scoped_to (: question_id)}' um alles zu bekommen auf einer glatten Linie mit RSPC3-Syntax. –

1

Sie können über das Thema gelesen und in dem offiziellen Quellcode Vorbehalt genannten Lösungen here

Eine Lösung ist:

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 
Verwandte Themen