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,
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.
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?}
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