2012-09-30 18 views
5

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?

+0

la validación debe estar en el equipo – apneadiving

+0

que no parece resolver el problema. – Marcus

+0

¿qué hiciste exactamente? – apneadiving

Respuesta

0

No creo que el problema sea con los métodos << o push porque ambos deberían desencadenar las validaciones del modelo.

Trate de usar:

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

+0

Terminé teniendo que usar los callbacks after_add y before_add de la rama principal de mongoid para que esto funcione. Los métodos de empuje atómico no realizan validaciones. – Marcus

Cuestiones relacionadas