2010-01-28 10 views
5

Hallo, ich verwende ein has_and_belongs_to_many in einem Modell. Ich möchte den Valitor der Präsenz für Arten setzen. und stellen Sie die maximale Anzahl der Arten pro Kern 3validieren Anwesenheit von 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 

wie kann ich tun?

dank

Antwort

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

Man könnte so etwas wie dieses (getestet auf Rails 2.3.4) versuchen:

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 

..., die in der folgenden Art und Weise funktioniert:

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 

Offensichtlich ist die Oben ist nicht besonders TROCKEN oder produktionsfertig, aber man kommt auf die Idee.

+1

Es wird angemerkt, dass die Validierungsmethode in 2.0.3 veraltet ist, aber es spricht nicht dafür. Kann jemand klären? – tadman

Verwandte Themen