【问题标题】:Validates uniqueness from foreign key of foreign key从外键的外键验证唯一性
【发布时间】:2016-04-30 00:22:15
【问题描述】:

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

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

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

这可能吗?

【问题讨论】:

    标签: ruby-on-rails foreign-keys validates-uniqueness-of


    【解决方案1】:

    没有数据的非规范化

    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
    

    【讨论】:

    • 问题是我的 CourseTemplate 没有用户所以我得到一个错误:undefined local variable or method `user' for #<0x007f993c73dd18>
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2013-01-06
    • 2015-04-18
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多