2013-04-28 14 views
10

के साथ विफल होने चाहिए मेरे पास 3 मॉडल, उपयोगकर्ता, खेल, और खिलाड़ी है। मूल रूप से उपयोगकर्ताओं और खेलों के बीच कई रिश्ते हैं, खिलाड़ियों के साथ जुड़ने वाली तालिका के रूप में, खिलाड़ियों को अन्य जानकारी है, इसलिए इसका अपना मॉडल है।कंधे matchers वैध_uniqueness_of scope

एक खिलाड़ी खेल आईडी और प्रयोक्ता आईडी की एक अद्वितीय कॉम्बो की जरूरत है, तो मैं खिलाड़ी में कहने के लिए करने की कोशिश की:

validates_uniqueness_of :user_id, :scope => :game_id 

और फिर मेरी कल्पना में, मैं (चाहिये matchers का उपयोग कर) ने कहा:

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

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

अभी तक मैं एक ActiveRecord :: statemen हो रही है: यहाँ

रिश्तों खिलाड़ी को परिभाषित करता है कर रहे हैं उस spec पर tinvalid त्रुटि

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)} को सबकुछ प्राप्त करने के लिए 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 
संबंधित मुद्दे