如何在创建之前验证连接模型的状态

时间:2015-03-29 02:12:44

标签: ruby-on-rails ruby-on-rails-4

当我第一次投票时,这次我试图尽可能清楚地了解我的目标。如果他们不清楚,请让我知道缺少什么。


我有课程和学生,他们有很多关系。当我为newCourseParticipation创建记录时,我想检查课程是否已经满(通过完整的方法)。

最好的方法是什么?我的第一个冲动是在控制器的Create动作中引入条件检查,现在我在Course模型中进行验证。但我认为最好是在CourseParticipation模型中进行“before_create”验证。不知道如何做到这一点。

我的课程模式

class Course < ActiveRecord::Base
  has_many :students, through: course_participations
  has_many :course_participations
end

我的学生模特

class Student < ActiveRecord::Base
  has_many :courses, through: course_participations
end

联接模式

class CourseParticipation < ActiveRecord::Base
  belongs_to :student
  belongs_to :course
end

在UsersController中:

def create
  @course = Course.find(params[:course_id])
  @student = Student.find_or_create_by(user_params)
  if @student
    @course.participate(@student)
  end
end

在课程模型中:

  def full?
    self.students.count >= self.max_students
  end

  def participate(student)
    if !self.full?
      course_booking = CourseParticipation.new(course_id: self.id, student_id: student.id)
      course_booking.save
    else
      self.errors.add(:course_full, "course is full")
    end
  end

目标:

  • 验证课程未满的最佳位置并创建CourseParticipation的实例

1 个答案:

答案 0 :(得分:2)

试试这个:

class CourseParticipation < ActiveRecord::Base
  belongs_to :student
  belongs_to :course

  before_create :check_class_size

  private
  def check_class_size
    !self.course.full?
  end
end