No estoy seguro de si esto es un problema con Mongoid o con los validadores de Rails estándar, pero los documentos que no son válidos aún se guardan en la base de datos.Documentos de guardado de Mongoid a pesar de la validación personalizada no válida
que tienen modelos creados para algo así como:
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
Yo esperaría que la siguiente prueba para pasar, pero no es así. En lugar de que mi validación personalizada impida que más de 12 equipos se agreguen a una liga, la liga se guarda con 13 equipos de todos modos.
# 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
Lo curioso es que, si cambio de la línea en la prueba que se suma el equipo 13 de acumulación de usar en lugar de crear, league.teams << FactoryGirl.build(:team)
, a continuación, se pasa la prueba. Sin embargo, esta no es una solución porque quiero garantizar que una liga no puede tener más de 12 equipos independientemente de si los equipos que se agregan son nuevos o ya están en la base de datos.
¿Hay alguna forma de garantizar esto?
Editar
Adición de un validador para el modelo del equipo, como lo hice a continuación, no parece funcionar bien.
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
creo que el problema tiene que ver con el hecho de que <<
y push
son operaciones atómicas, y por lo tanto saltar devoluciones de llamada y validaciones. Dicho esto, este debe ser un uso bastante común, ¿no? Entonces, ¿cómo validan otras personas la cantidad de documentos a los que se hace referencia?
la validación debe estar en el equipo – apneadiving
que no parece resolver el problema. – Marcus
¿qué hiciste exactamente? – apneadiving