0

Rails アプリケーションには、User、Course、および CourseTemplate の 3 つのモデルがあります。

Course は User に属し、CourseTemplate は Course に属します。

私がやりたいことは、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_idCourseTemplate に追加してから、一意性を検証するスコープ機能を使用するだけです。

以下に、コールバックを使用して 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 に答える