Как говорится в документации , метод collection<<(object, …)
Добавляет один или несколько объектов в коллекцию, устанавливая их внешние ключи в первичном ключе коллекции.Обратите внимание, что эта операция немедленно запускает обновление SQL без ожидания вызова сохранения или обновления родительского объекта, если родительский объект не является новой записью.Это также будет запускать проверки и обратные вызовы связанных объектов.
Это означает, что при добавлении пользователя в группу по уходу, например
care_team.users << user
, пользователь добавляетсянемедленно.Вам не нужно звонить care_team.save
, чтобы сохранить изменения.Проверка CareTeam
не будет применена.Это происходит потому, что изменения происходят в объекте user
: его атрибут care_team_id
устанавливается в care_team.id
, а затем user
сохраняется, если все его проверки пройдены.
Таким образом, вы можете применить свое ограничениеизменив свою валидацию в CareTeam
следующим образом:
def validate_user_limit
if users.count > NUMBER_OF_PERMITTED_USERS
errors[:base] << "This care team has already enough users"
end
end
и позвоните care_team.save
явно , чтобы сделать валидацию.Однако это не решает проблему вообще: к этому моменту пользователь уже добавлен в команду по уходу.Проверка не удастся, но пользователь останется в команде по уходу.
Чтобы устранить проблему, валидацию следует перенести в User
модель:
class User < ApplicationRecord
validate :validate_care_team_user_limit
private
def validate_care_team_user_limit
if care_team_id && User.where(care_team_id: care_team_id).count >= CareTeam::NUMBER_OF_PERMITTED_USERS
errors.add(:care_team_id, "User cannot be added to that care team")
end
end
end