2012-09-30 8 views
5

Nie jestem pewien, czy jest to problem z Mongoid lub ze standardowymi walidatorami Rails, ale dokumenty, które są nieprawidłowe, są nadal zapisywane w bazie danych.Mongoid zapisywanie dokumentów pomimo nieprawidłowego sprawdzania poprawności

Mam modeli utworzonych w celu coś takiego:

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 

spodziewałbym następujący test zdać, ale tak nie jest. Zamiast mojej niestandardowej weryfikacji uniemożliwiającej dodanie więcej niż 12 drużyn do ligi, liga zostaje uratowana w 13 drużynach.

# 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 

Najśmieszniejsze jest to, czy mogę zmienić linię w teście, który dodaje 13 zespół do korzystania build zamiast tworzyć, league.teams << FactoryGirl.build(:team), test przechodzi. Nie jest to jednak rozwiązanie, ponieważ chcę zagwarantować, że Liga nie może mieć więcej niż 12 drużyn, niezależnie od tego, czy dodane zespoły są nowe, czy już są w DB.

Czy jest to mimo wszystko gwarantowane?

Edit

Dodawanie walidator do modelu zespołu, jak ja poniżej, wydaje się nie działa.

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 

Wierzę, że problem ma do czynienia z faktem, że << i push są operacje atomowe i dlatego pominąć wywołania zwrotne i walidacji. Biorąc to pod uwagę, musi to być dość powszechny przypadek, prawda? W jaki sposób inne osoby sprawdzają poprawność liczby dokumentów, do których się odwołujemy?

+0

walidacja powinna być w zespole – apneadiving

+0

Nie wydaje się, aby rozwiązać ten problem. – Marcus

+0

co dokładnie zrobiłeś? – apneadiving

Odpowiedz

0

Nie sądzę, że problem dotyczy metod << lub push, ponieważ oba powinny wywoływać sprawdzanie poprawności modelu.

Spróbuj użyć:

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

+0

Skończyło się na tym, że musiałem użyć callbacków after_add i before_add głównej gałęzi mangusty, aby to zadziałało. Atomowe metody wypychania nie przeprowadzają walidacji. – Marcus