5

これが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が不可分操作であるという事実に関係していると思います。したがって、コールバックと検証をスキップします。そうは言っても、これはかなり一般的なユースケースに違いありませんね。では、他の人は参照されているドキュメントの数をどのように検証していますか?

4

1 に答える 1

0

どちらもモデルの検証をトリガーする必要があるため、<<またはメソッドに問題があるとは思いません。push

使用してみてください:

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

于 2012-12-21T02:00:55.143 に答える