Ruby on rails 限制Rails中的最大关联

Ruby on rails 限制Rails中的最大关联,ruby-on-rails,activerecord,has-many-through,Ruby On Rails,Activerecord,Has Many Through,我有两个模型团队和比赛以及一个团队比赛协会 类匹配:团队,:来源=>:团队 有很多:团队比赛吗 def注意力小组 self.team_匹配。创建!:团队=>团队 rescue ActiveRecord::RecordInvalid 无 终止 终止 类团队:团队匹配,:源=>:匹配 有很多:团队比赛吗 终止 类TeamMatch3 errors.add不能添加超过3个团队End此方法有效吗?如果匹配项超过5个,它将阻止保存匹配项,但不会阻止添加新匹配项。它将始终有效,我认为您没有了解自定义验证。是

我有两个模型团队和比赛以及一个团队比赛协会

类匹配:团队,:来源=>:团队 有很多:团队比赛吗 def注意力小组 self.team_匹配。创建!:团队=>团队 rescue ActiveRecord::RecordInvalid 无 终止 终止 类团队:团队匹配,:源=>:匹配 有很多:团队比赛吗 终止 类TeamMatch 编辑: 根据建议进行更新。m=工厂女孩。创建:团队,t..2=工厂女孩。创建:团队


您应该添加一些自定义验证,如下所示:

class Match < ActiveRecord::Base
    has_many :teams, :through => :team_matches, :source => :team
    has_many :team_matches

  validate :max_associate

  def max_associate
    errors.add(:teams, "can not be added more than 5") if teams.length > 5
  end

end

您可以使用关联回调

has_many :teams, :through => :team_matches, :source => :team, :before_add => :limit_number_of_teams

def limit_number_of_teams(added_team)
  raise Exception.new('Team limit for the match reached') if teams.size >= 2
end

我只是意识到有更简洁的解决方案,这是可能的,因为它有很多通过关联:

class TeamMatch < ActiveRecord::Base
  belongs_to :match
  belongs_to :team

  validate :teams_per_match_limit

  def teams_per_match_limit
    errors.add(:base, 'blah') if par.children.size > 1
  end

end

在团队模型中,您可以编写一个自定义的验证方法,如validate:check_teams def check_teams if matches.size>3 errors.add不能添加超过3个团队End此方法有效吗?如果匹配项超过5个,它将阻止保存匹配项,但不会阻止添加新匹配项。它将始终有效,我认为您没有了解自定义验证。是的,它可以…….添加始终检查验证,除非您执行一些验证:false…投票我刚刚检查过,向关联添加新对象不会运行父验证。它会保存孩子并运行孩子验证,但不会运行家长验证。我已经测试了你的建议,但测试失败。它给了我这个错误ArgumentError:错误的参数数量1 for 0更新了我的初始帖子,以包含团队参加MatchCheck的功能我的更新,正如您所看到的,它不关心我是否向MatchDidi添加第三个团队您将限制设置为2,还是您只是复制了我的硬编码4?:是的,我已将您的>=4替换为>2Ok,仅此而已。首先,你的参与方法没有意义,因为它是在创建一个新的团队,而不是分配现有的团队。您只需要将团队分配给关联团队=2如果我创建了一个新的团队匹配,而不是使用Attribute方法创建了一个团队匹配,则不知道哪一个答案正确:这个答案可能更好,但也有缺点-如果您创建了一个新的匹配,在保存它之前,您可以为它分配任意数量的团队。是否要保存数据库?是否有效?将返回真值。它将无法保存并抛出AxException,仍然有效吗?应该返回false。也许可以通过添加“:validate=>true”来修复此问题,但似乎可能会有更多类似的问题。您建议哪种解决方案更好?这一种解决方案没有明显的解决方法,因为第二种解决方案不适用于您发布的Attribute方法。
class TeamMatch < ActiveRecord::Base
  belongs_to :match
  belongs_to :team

  validate :teams_per_match_limit

  def teams_per_match_limit
    errors.add(:base, 'blah') if par.children.size > 1
  end

end