У меня есть отношение многие ко многим с таблицей соединений в моем приложении Rails.Я использую has_many: через идиому в моих моделях.Для простоты, давайте назовем мой ученик первого класса, мой курс второго класса и класс регистрации Enrollment (который содержит поля student_id и course_id).Я хочу убедиться, что данный Студент связан с данным Курсом не более одного раза (т. Е. Кортеж {student_id, course_id} должен быть уникальным в таблице регистрации).
Итак, у меня есть миграция a, которая обеспечивает эту уникальность.
def change
add_index :enrollments, [:student_id, :course_id], :unique => true
end
Кроме того, классы моей модели определены так:
class Student < ActiveRecord::Base
has_many :enrollments
has_many :courses, :through => :enrollment
end
class Course < ActiveRecord::Base
has_many :enrollments
has_many :students, :through => :enrollment
end
class Enrollment < ActiveRecord::Base
belongs_to :student
belongs_to :course
validates :student, :presence => true
validates :course, :presence => true
validates :student_id, :uniqueness => {:scope => :course_id}
end
В консоли rails,Я могу сделать следующее:
student = Student.first
course = Course.first
student.courses << course
#... succeeds
student.courses << course
#... appropriately fails and raises an ActiveRecord::RecordInvalid exception
В моем тесте RSpec я делаю то же самое, и я не получаю исключения со следующим кодом:
@student.courses << @course
expect { @student.courses << @course }.to raise_error(ActiveRecord::RecordInvalid)
И поэтому мой тест не пройдени отчеты:
expected ActiveRecord::RecordInvalid but nothing was raised
Что здесь происходит?Что я могу делать не так?Как мне это исправить?