1

私はモデルWorkoutとUserを持っています。また、UserWorkoutモデルにはis_creator属性があります。これは、ユーザーが作成者であったことを示します。しかし、ワークアウトには作成者が1人だけ必要です。そのような検証を追加する最良の方法は何ですか?Rails has_many:バリデーションネストされたレコードは特定のパラメータでカウントされます

class Workout < ActiveRecord::Base 

    has_many :user_workouts, inverse_of: :workout, dependent: :destroy 
    has_many :participants, through: :user_workouts, source: :user 

    def creator 
    participants.where(user_workouts: { is_creator: true }).order('user_workouts.created_at ASC').first 
    end 

end 

class UserWorkout < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :workout 

end 

class User < ActiveRecord::Base 

    has_many :user_workouts, inverse_of: :user, dependent: :destroy 
    has_many :workouts, through: :user_workouts 

end 

答えて

1

ファーストを追加することができます追加することができますあなたのDB構造。私はis_creatorUserWorkoutにあってはならないと思う。それはUserWorkout

の間に1対多の関係がWorkoutcreated_by_idを維持し、追加の数多くのWorkoutを作成することができますWorkout

ユーザーによって作成することができ Workoutつまり

Userの責任でありますその中の関連。物事をより簡単かつ簡単にします。

class Workout < ActiveRecord::Base 

    has_many :user_workouts, inverse_of: :workout, dependent: :destroy 
    has_many :participants, through: :user_workouts, source: :user 

    belongs_to :creator , class_name: "User", foreign_key: "created_by_id" 

end 

、それは今、あなたはあなたがワークアウトの作成者を見つける必要があるたびのような複雑なクエリを必要としないワークアウト

における単一の列だとして一意性をチェックする必要がある文句を言いません。それは単純なbelongs_toの関連付けです。すべてがレールで気になるでしょう:)

+0

良いアイデアをありがとう) –

2

はあなたのDBMSに応じて、設計上の欠陥ではありfiltered/partial indexアクティブレコードレベルで

workout_id where is_creator = trueに、あなたはすべてのcustom validation

class UserWorkout 
    validate :workout_has_only_one_creator 

    private 

    def workout_has_only_one_creator 
    if self.class.find_by(workout_id: workout_id, is_creator: true) 
     errors.add(:is_creator, 'can only have one creator') 
    end 
    end 
関連する問題