結合テーブル CourseUser を使用した User モデルとの関連付けにより、多くのコースモデルがあります。結合テーブルには、ユーザーが引き受ける役割を指定する属性 type_str があります。各コース、ユーザー ペアの結合テーブルに 1 つのレコードのみが存在することを確認するための検証を追加しました。問題は、もちろん検証が失敗する新しいレコードを追加するのではなく、このレコードが既に存在する場合に更新することです。
ユーザークラス:
class User < ActiveRecord::Base
...
has_many :courses_enrolled_on, :through => :course_enrollees, :source => :course, :conditions => { :course_users => { :type_str => "enrollee" } }
has_many :course_users
has_many :courses, :through => :course_users, :source => :course, :readonly => true
end
コースクラス
class Course < ActiveRecord::Base
has_many :course_enrollees, :conditions => { :type_str => "enrollee" }, :class_name => CourseUser
has_many :enrollees, :through => :course_enrollees, :source => :user
has_many :course_users
has_many :users, :through => :course_users, :source => :user, :readonly => true
end
コースクラス:
class CourseUser < ActiveRecord::Base
belongs_to :course
belongs_to :user
validates_uniqueness_of :course_id, :scope => :user_id
end