Rails アプリケーションには、User、Course、および CourseTemplate の 3 つのモデルがあります。
Course は User に属し、CourseTemplate は Course に属します。
私がやりたいことは、CourseTemplate 名とユーザー ID の間の一意性を検証することです。
これは可能ですか?
Rails アプリケーションには、User、Course、および CourseTemplate の 3 つのモデルがあります。
Course は User に属し、CourseTemplate は Course に属します。
私がやりたいことは、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