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?
walidacja powinna być w zespole – apneadiving
Nie wydaje się, aby rozwiązać ten problem. – Marcus
co dokładnie zrobiłeś? – apneadiving