2012-09-30 16 views
5

के बावजूद Mongoid बचत दस्तावेज़ मुझे यकीन नहीं है कि यह Mongoid के साथ या मानक रेल मान्यताओं के साथ एक समस्या है, लेकिन अमान्य दस्तावेज़ अभी भी डेटाबेस में सहेजे जा रहे हैं।अवैध कस्टम सत्यापन

मैं मॉडल की तरह कुछ करने के लिए स्थापित किया है:

class League 
    include Mongoid::Document 

    has_many :teams 

    validate do 
    if teams.size > 12 
     errors.add(:teams, 'too many teams') 
    end 
    end 
end 

class Team 
    include Mongoid::Document 

    belongs_to :league 
end 

मैं निम्नलिखित परीक्षा उत्तीर्ण की उम्मीद करेंगे, लेकिन ऐसा नहीं है। लीग में 12 से अधिक टीमों को जोड़ने से रोकने के मेरे कस्टम सत्यापन के बजाय, लीग को 13 टीमों के साथ भी बचाया जाता है।

# Factory for a League. 
FactoryGirl.define do 
    factory :league do 
    name "Test League" 

    factory :league_with_teams do 
    ignore do 
     teams_count 5 
    end 

    after(:create) do |league, evaluator| 
     FactoryGirl.create_list(:team, 
           evaluator.teams_count, 
           league: league) 
    end 
    end 
end 

describe League do 
    it "should not allow more than 12 teams" do 
    league = FactoryGirl.create(:league_with_teams, teams_count: 12) 
    league.teams << FactoryGirl.create(:team) 
    league.should_not be_valid # passes 
    League.find(league.id).teams.size.should eq(12) # fails 
    end 
end 

अजीब बात यह है कि अगर मैं परीक्षण है जो बजाय निर्माण का उपयोग करें, league.teams << FactoryGirl.build(:team) बनाने के लिए 13 वीं टीम कहते हैं में लाइन बदलने के लिए, तो परीक्षण से गुजरता है। हालांकि यह कोई समाधान नहीं है क्योंकि मैं यह गारंटी देना चाहता हूं कि लीग में 12 से अधिक टीमें नहीं हो सकती हैं, चाहे टीमों को जोड़ा जा रहा है या नहीं, डीबी में पहले से ही हैं या नहीं।

क्या यह गारंटी देने के लिए वैसे भी है?

संपादित

टीम मॉडल के लिए एक सत्यापनकर्ता जोड़ा जा रहा है, जैसे मैं नीचे था, या तो काम करने के लिए प्रतीत नहीं होता।

class Team 
    include Mongoid::Document 

    belongs_to :league 

    validate do |team| 
    if league.teams.size > 12 
     errors.add :base, "cannot have more than 12 teams in a league" 
    end 
    end 
end 

मेरा मानना ​​है कि समस्या तथ्य यह है कि << और push परमाणु संचालन कर रहे हैं के साथ क्या करना है, और इसलिए वे कॉलबैक और सत्यापन को छोड़ दें। कहा जा रहा है, यह एक काफी आम उपयोग होना चाहिए, नहीं? तो संदर्भित किए जा रहे दस्तावेजों की संख्या को प्रमाणित करने वाले अन्य लोग कैसे हैं?

+0

सत्यापन टीम – apneadiving

+0

कि इस मुद्दे को हल करने के लिए प्रतीत नहीं होता है में होना चाहिए। – Marcus

+0

आपने वास्तव में क्या किया? – apneadiving

उत्तर

0

मुझे नहीं लगता कि समस्या << या push विधियों के साथ है क्योंकि दोनों को मॉडल की मान्यताओं को ट्रिगर करना चाहिए।

उपयोग करके देखें:

league.teams << FactoryGirl.create(:team, league: league)

+0

मैं इसे काम करने के लिए mongoid की मास्टर शाखा के after_add और पहले_add कॉलबैक का उपयोग करने के लिए समाप्त हो गया। परमाणु धक्का विधियां सत्यापन नहीं करती हैं। – Marcus