how to validate associated model id?

后端 未结 3 1362
忘了有多久
忘了有多久 2021-02-03 10:07

I have a student and a course model. Student belongs to course, and course has many students.

class Student < ActiveRecord::Base
  attr_accessible :course_id,         


        
相关标签:
3条回答
  • 2021-02-03 10:54

    You should look into creating a custom validation method:

    class Student < ActiveRecord::Base
      validates :course_id, presence: true, numericality: { only_integer: true }
      ...
      validate :validate_course_id
    
    private
    
      def validate_course_id
        errors.add(:course_id, "is invalid") unless Course.exists?(self.course_id)
      end
    end
    

    First, your model will make sure that the course_id is a valid integer, and then your custom validation will make sure that the course exists in the database.

    0 讨论(0)
  • 2021-02-03 11:02

    You can validate the presence of the course association. So, if does not exists, valid? will be false.

    Your class should be:

    class Student < ActiveRecord::Base
      attr_accessible :course_id, :name, :password, :status, :studentID, :year
      belongs_to :course
    
      validates :course, :name, :password, :status, :studentID, :year, presence: true
    end
    

    The differences of validating foreign key and the association itself are explained at this post.

    If you don't need to validate presence of course, you can do this workaround:

    validates :course, presence: true, if: -> {course_id.present?}
    
    0 讨论(0)
  • 2021-02-03 11:02

    You can just do a custom validation method that checks the validity of your course id:

    # course.rb
    validates :course_id_is_valid
    
    def course_id_is_valid
      if #course id isn't valid
        errors.add(:course_id, "is invalid")
      end
    end
    

    Alternately, if the course list is a discrete list, you can use the :in option on validations:

    # course.rb
    validates :course_id, :inclusion => { :in => list_of_courses, :message => "%{value} is not a course id" }
    

    There are more options. Both of these examples come from the Rails docs:

    http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods

    0 讨论(0)
提交回复
热议问题