Убедитесь, что два поля принадлежат одному и тому же объекту - PullRequest
3 голосов
/ 10 января 2012

У меня есть несколько моделей:

  • Пользователь = обычный пользовательский класс (не принадлежит ни к чему)
  • Вызов = любой вид соревнования (не принадлежит ни к чему)
  • Team = список пользователей (принадлежит Challenge)
  • Coach = имя и роль тренера, который может быть разделен между несколькими командами, но существует только для данного Challenge (принадлежит Challenge)
  • TeamCoach = ассоциация между командой и тренером (принадлежит команде и тренеру)

Я хочу убедиться, что TeamCoach с командой и тренером невозможенкоторые не относятся к одному и тому же вызову.

Моя текущая (рабочая) реализация выглядит следующим образом:

class TeamCoach < ActiveRecord::Base
  attr_readonly :coach_id, :team_id

  belongs_to :coach
  belongs_to :team

  validates :coach_id, :presence => true,
                       :uniqueness => { :scope => :team_id }

  class SameChallengeValidator < ActiveModel::Validator
   def validate(team_coach)
     if team_coach.team.challenge_id != team_coach.coach.challenge_id
       team_coach.errors[:base] << "The team and coach do not belong to the same challenge."
     end
   end
  end 

  validates_with SameChallengeValidator
end

Существует ли более короткий и более элегантный способ проверки SameChallengeValidator?

Спасибо,

1 Ответ

3 голосов
/ 10 января 2012

Вам не нужно писать собственный класс валидатора.Вы можете просто использовать метод validate вместо:

class TeamCoach < ActiveRecord::Base
  attr_readonly :coach_id, :team_id

  belongs_to :coach
  belongs_to :team

  validates :coach_id, :presence => true,
                       :uniqueness => { :scope => :team_id }
  validate :team_and_coach_belong_to_same_challenge

  private
   def team_and_coach_belong_to_same_challenge
     errors.add(:base, "The team and coach do not belong to the same challenge.") if self.team.challenge_id != self.coach.challenge_id
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...