これがMongoidの問題なのか、標準のRailsバリデーターの問題なのかはわかりませんが、無効なドキュメントはまだデータベースに保存されています。
モデルを次のように設定しています。
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
面白いことに、テストの行を変更して、作成ではなくビルドを使用するように13番目のチームを追加するとleague.teams << FactoryGirl.build(:team)
、テストに合格します。ただし、追加するチームが新規であるかDBに既に存在するかどうかに関係なく、リーグが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
が不可分操作であるという事実に関係していると思います。したがって、コールバックと検証をスキップします。そうは言っても、これはかなり一般的なユースケースに違いありませんね。では、他の人は参照されているドキュメントの数をどのように検証していますか?