Проверка модели Rails has_many - PullRequest
0 голосов
/ 27 ноября 2018

Привет, ребята, в настоящее время работают с парой моделей, которые связаны друг с другом.Ассоциации работают отлично, но я пытаюсь ограничить количество пользователей, которые могут принадлежать к модели групп обслуживания, я попробовал метод проверки ниже, и он, похоже, не вызывает каких-либо ошибок или чего-либо еще.пользователи могут продолжать добавлять себя в эту команду, я пытаюсь ограничить сумму до.есть идеи?

user.rb

class User < ApplicationRecord
   devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable 
   validates_presence_of :phone, :city, :state, :street, :zip, presence: true, on: :create

   belongs_to :care_team, optional: true
end

care-team.rb

class CareTeam < ApplicationRecord
   NUMBER_OF_PERMITTED_USERS = 3 

   belongs_to :user, optional: true 

   has_many :users

   validate :validate_user_limit

   private
      def validate_user_limit(user)
         raise Exception.new if users.count > NUMBER_OF_PERMITTED_USERS
      end 
end

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Как говорится в документации , метод 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
0 голосов
/ 27 ноября 2018

Вы не должны вызывать исключения при проверках, просто добавьте ошибку, если условие истинно:

def validate_user_limit #the (user) param does not go here
  self.errors.add(:users, "Too many users") if users.count > NUMBER_OF_PERMITTED_USERS
end

Если вы хотите получить исключение с недопустимой записью, используйте save! вместо save, который возвращает ложь для недействительных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...