从外键的外键验证唯一性
Validates uniqueness from foreign key of foreign key
我的 rails 应用程序中有 3 个模型,User、Course 和 CourseTemplate。
课程属于用户,课程模板属于课程。
我想做的是验证 CourseTemplate 名称和 User id 之间的唯一性。
这可能吗?
没有数据的反规范化
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
我的 rails 应用程序中有 3 个模型,User、Course 和 CourseTemplate。
课程属于用户,课程模板属于课程。
我想做的是验证 CourseTemplate 名称和 User id 之间的唯一性。
这可能吗?
没有数据的反规范化
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