ruby on rails - How to validate the state of a join model before creation -
as got downvoted first time, time try clear possible goals. if they're not clear, please let me know what's missing.
i have course , students have has_many through: relationship. when create record newcourseparticipation, check if course full (via full? method).
what best way that? first impulse introduce conditional check in create action of controller, i'm doing validation in course model. think best "before_create" validation in courseparticipation model. not sure how though.
my course model
class course < activerecord::base has_many :students, through: course_participations has_many :course_participations end
and student model
class student < activerecord::base has_many :courses, through: course_participations end
the join model
class courseparticipation < activerecord::base belongs_to :student belongs_to :course end
in userscontroller:
def create @course = course.find(params[:course_id]) @student = student.find_or_create_by(user_params) if @student @course.participate(@student) end end
in course model:
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 full") end end
goal:
- best place validate course not full , create instance of courseparticipation
try this:
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
Comments
Post a Comment