1

Model UserWorkout ile çok sayıda ilgili Kullanıcı ve Kullanıcı var. Ve UserWorkout modelinde şu özellik bulunur: hangi kullanıcının içerik oluşturduğunu gösteren is_creator. Ancak, egzersiz sadece bir içerik oluşturucuya sahip olmalıdır. Böyle bir doğrulama eklemenin en iyi yolu nedir?Raylar has_many: doğrulama yoluyla iç içe geçmiş kayıtlar belirli bir param ile sayılır.

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 

cevap

1

İlk ekleyebilir ekleyebilir DB yapınız. is_creator'un UserWorkout'da bulunmaması gerektiğini düşünüyorum. O yüzden User ve Workout

arasında bire çok ilişki Workout bir created_by_id tutun ve eklemek var birçok Workout oluşturabilir Workout

bir kullanıcı tarafından oluşturulabilir Workout başka deyişle

ve User bir sorumluluktur içindeki ilişki. Birçok şeyi daha kolay ve basit hale getirecek.

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 

ve

Egzersiz

tek sütun Şimdi bir egzersiz yaratıcısı bulmalıyız her zaman gibi karmaşık bir sorgu gerekmez olduğu gibi benzersizliğini denetlemek için herhangi bir ihtiyaç olmayacaktır. Bu basit bir belongs_to derneği. Her şey rails tarafından halledilecek :)

+0

İyi fikir için teşekkür ederim) –

2

İVTYS'niz bağlı olarak, tasarım kusur içinde olduğu bir filtered/partial index aktif rekor seviyede

workout_id where is_creator = true üzerine, tüm bir 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 
İlgili konular