Поле validates_uniqueness_of, ограниченное отношением has_one - PullRequest
0 голосов
/ 21 июля 2011

У меня есть следующие модели:

class Section < ActiveRecord::Base
  belongs_to :course                                                          
  has_one :term, :through => :course
end

class Course < ActiveRecord::Base
  belongs_to :term
  has_many :sections
end

class Term < ActiveRecord::Base
  has_many :courses
  has_many :sections, :through => :courses
end

Я хотел бы иметь возможность сделать следующее в моей модели Section (call_number - это поле в Section):

validates_uniqueness_of :call_number, :scope => :term_id

Это, очевидно, не работает, потому что Section не имеет term_id, , так как я могу ограничить область действия моделью отношения?

Я пыталсясоздание собственного валидатора для Section безрезультатно (не работает, когда я создаю новый Section с ошибкой "неопределенный метод 'section' для nil: NilClass" ):

def validate_call_number
  if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0
    self.errors[:base] << "Call number exists for term"
    false
  end
  true
end

Большое спасибо!

1 Ответ

0 голосов
/ 21 июля 2011

Если ваш код проверки верен, почему бы вам просто не добавить проверку на существование термина?

def validate_call_number
  return true if self.term.nil? # add this line
  if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0
    self.errors[:base] << "Call number exists for term"
    false
  end
  true
end
...