Я не смог попробовать это, но я не понимаю, почему это не должно работать.
Шаг первый: определить валидатор для родительского объекта (это простая реализация - может/ следует сделать более общим):
class Project < ActiveRecord::Base
validate :max_tasks
def max_tasks
if tasks.count > 20
errors.add_to_base("Should not have more than 20 tasks")
end
end
end
Шаг второй: Включите проверку проекта из задач:
class Task < ActiveRecord::Base
validates_associated :project
end
И я думаю, что вы должны быть в бизнесе.Когда вы попытаетесь сохранить новую задачу, она проверит связанный проект, и проверка завершится неудачей, если (сейчас) связано более 20 задач.
На всякий случай, если вы захотите сделать это более общим,Вы могли бы сделать что-то вроде:
class NumberOfAssociatedValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if options[:maximum] && record.send(attribute).count > options[:maximum]
record.errors[attribute] << "must not have more than #{options[:maximum]}"
end
if options[:minimum] && record.send(attribute).count < options[:minimum]
record.errors[attribute] << "must not have less than #{options[:minimum]}"
end
end
end
class MyModel < ActiveRecord::Base
validates :my_association, :number_of_associated => {:maxiumum => 20}
end