【发布时间】:2019-09-23 09:17:28
【问题描述】:
我有以下型号:
class Course < ApplicationRecord
belongs_to :super_course, inverse_of: :courses
...
end
class SuperCourse < ApplicationRecord
has_many :courses, dependent: :nullify, inverse_of: :super_course
...
end
这两个模型如下相互关联:SuperCourse 将具有某些特定条件的大量 Courses 分组。问题是,在后台我可以更改Course 的SuperCourse,并且我不想有空的SuperCourses(即没有任何Course 关联)。
我一直在尝试做的是向Course 模型添加一个after_update 回调,以便它检查以前的SuperCourse 现在是否没有关联任何Course,但我没有不知道这是否是最好的解决方案(AFAIK,不太推荐回调)。根据this very old thread 中的回复,我现在得到的是:
class Course < ApplicationRecord
belongs_to :super_course, inverse_of: :courses
after_update :destroy_empty_super_course
...
private
def destroy_empty_super_course
id = super_course_id_changed? ? super_course_id_was : super_course_id
super_course = SuperCourse.find(id)
super_course.destroy if super_course.courses.empty?
end
end
但是当我测试这个时,我什至没有得到我想要的。这是失败的rspec sn-p:
context "when super_course is updated" do
let(:super_course) { create(:super_course, courses: []) }
let(:course) { create(:course, super_course: super_course) }
let(:new_super_course) { create(:super_course, courses: []) }
let(:new_course) { create(:course, semester: course.semester, subject: course.subject, super_course: new_super_course) }
subject { course.update!(super_course: new_super_course) }
it "should remove old super_course" do
expect { subject }.to change(SuperCourse, :count).by(-1)
end
end
这是我最好的选择吗?如果是这样,我怎样才能使它工作?如果没有,最好的选择是什么?
提前谢谢大家!
【问题讨论】:
标签: ruby-on-rails ruby activerecord