簡體   English   中英

從外鍵的外鍵驗證唯一性

[英]Validates uniqueness from foreign key of foreign key

我的Rails應用程序中有3個模型:User,Course和CourseTemplate。

課程屬於用戶,課程模板屬於課程。

我要做的是驗證CourseTemplate名稱和用戶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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM