проверьте присутствие has_and_belongs_to_many

Привет я использую has_and_belongs_to_many в модели. Я хочу, устанавливает valitor присутствия для видов. и определенный макс. номер видов на ядро к 3

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

как я могу сделать?

спасибо

5
задан Luca Romagnoli 28 January 2010 в 21:41
поделиться

2 ответа

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
6
ответ дан 14 December 2019 в 04:38
поделиться

Можно попробовать что-то подобное (протестировано на рельсах 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

... что работает следующим образом:

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

Очевидно, что вышесказанное не особенно DRY и не готово к производству, но вы понимаете идею.

2
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: