0

我的 Rails 应用程序中有 3 个模型,用户、课程和课程模板。

一个课程属于一个用户,一个课程模板属于一个课程。

我想要做的是验证 CourseTemplate 名称和用户 ID 之间的唯一性。

这可能吗?

4

1 回答 1

2

没有数据的非规范化

class CourseTemplate < ActiveRecord::Base
  belongs_to :course
  has_one :user, through: :course
  validate :unique_course_template_for_user

  private

  def unique_course_template_for_user
    errors.add(:name, 'Must be unique') if CourseTemplate.find_by(user: user.id, name: self.name).count > 0
  end
end

随着数据的非规范化

如果您对数据的一些非规范化表示满意,您可以添加user_id到 CourseTemplate,然后简单地使用验证唯一性的范围功能。

下面我将展示如何使用回调来维护 CourseTemplate 中的 user_id。请注意,它假定课程不能移动到其他用户。

class CourseTemplate < ActiveRecord::Base
  before_create :copy_user_id_from_course

  validates :name, uniqueness: { scope: :user_id, message: 'Must be unique for the same user'}

  private

  def copy_user_id_from_course
    self.user_id = course.user_id
    true
  end
end

如果课程可以移动到其他用户,您应该在课程上添加回调:

class Course < ActiveRecord::Base
  after_save :set_course_templates_user, if: :user_id_changed?

  private

  def set_course_templates_user
    course_templates.update_all user_id: self.user_id
  end

end
于 2016-04-30T00:27:03.497 回答