2010-01-28 5 views
5

Hola, estoy usando un has_and_belongs_to_many en un modelo. Quiero configurar el validador de presencia para tipos. y establecer el número máximo de clases por núcleo a 3validate presence of has_and_belongs_to_many

class Core < ActiveRecord::Base 
    has_and_belongs_to_many :kinds, :foreign_key => 'core_id', :association_foreign_key => 'kind_id' 
end 

qué puedo hacer?

gracias

Respuesta

6
validate :require_at_least_one_kind 
validate :limit_to_three_kinds 

private 

def require_at_least_one_kind 
    if kinds.count == 0 
    errors.add_to_base "Please select at least one kind" 
    end 
end 

def limit_to_three_kinds 
    if kinds.count > 3 
    errors.add_to_base "No more than 3 kinds, please" 
    end 
end 
2

Usted podría intentar algo como esto (probado en Rails 2.3.4):

class Core < ActiveRecord::Base 
    has_and_belongs_to_many :kinds, :foreign_key => 'core_id', :association_foreign_key => 'kind_id' 
    validate :maximum_three_kinds 
    validate :minimum_one_kind 

    def minimum_one_kind 
    errors.add(:kinds, "must total at least one") if (kinds.length < 1) 
    end 

    def maximum_three_kinds 
    errors.add(:kinds, "must not total more than three") if (kinds.length > 3) 
    end 
end 

... que funciona de la siguiente manera:

require 'test_helper' 

class CoreTest < ActiveSupport::TestCase 

    test "a Core may have kinds" do 
    core = Core.new 
    3.times { core.kinds << Kind.new } 

    assert(core.save) 
    end 

    test "a Core may have no more than 3 kinds" do 
    core = Core.new 
    4.times { core.kinds << Kind.new } 
    core.save 

    assert_equal(1, core.errors.length) 
    assert_not_nil(core.errors['kinds']) 
    end 

    test "a Core must have at least one kind" do 
    core = Core.new 
    core.save 

    assert_equal(1, core.errors.length) 
    assert_not_nil(core.errors['kinds']) 
    end 
end 

Obviamente, el arriba no es particularmente seco o listo para producción, pero se entiende.

+1

Se señala que el método de validación está en desuso en 2.0.3, pero no dice a favor de qué. ¿Alguien puede aclarar? – tadman

Cuestiones relacionadas