我有一个模型训练和用户,它通过模型将尽可能多的模型关联到多个模型
用户训练。而model userworkout有一个属性:is_creator,它显示了哪个用户是创建者。但是锻炼应该只有一个创造者。添加这种验证的最佳方法是什么?

 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

最佳答案

首先,你的数据库结构有一个设计缺陷。我认为is_creator不应该在UserWorkout中。这是Workout的责任
换句话说,用户可以创建Workout,而User可以创建多个Workout,因此UserWorkout之间是一对多的关系
created_by_id中保留一个Workout并在其中添加一个关联它会使很多事情变得简单和容易。

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

不需要检查它的唯一性,因为它是训练中的单列
现在,您不需要像每次需要查找训练创建者时那样进行复杂的查询。这是一个简单的关联一切都将由铁轨负责:)

关于ruby-on-rails - Rails has_many:通过验证嵌套记录按特定参数计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36516471/

10-12 05:46