1

您将如何验证属于父对象的子对象的数量?

例如,如果我有一个接受嵌套属性作为答案的问题对象:

class Question < ActiveRecord::Base
  has_many :answers
  accepts_nested_attributes_for :answers, :allow_destroy => true
end

而且我想限制答案的数量,我可能会向答案对象添加自定义验证,以检查其父对象并计算其他答案,如下所示:

class Answer < ActiveRecord::Base

  belongs_to :question
  validate :check_max_answers

  private


  def check_max_answers
    count = question.answers.select {|a| a != self}.count
    if (count > 10)
      errors.add(:answers, 'Too many answers!')
    end
  end

end

当 check_max_answers 运行时,它只计算已经保留的其他答案。

因为答案被保存为嵌套属性,所以验证都在初始保存时通过,因为没有保存任何问题,然后它们都被保存并因此变得无效!

同样,如果我将验证放在问题对象上,也会发生同样的问题,因为 answers.count 在初始保存之前始终为 0。

我究竟做错了什么?是否有解决方法来执行这种验证?

谢谢你的帮助

4

2 回答 2

1

解决了这个。它只计算数据库中的答案的原因是我使用了 .count 而不是 .size。

就我而言,我还需要打折标记为销毁的答案。所以这个问题的验证看起来像:

  def check_answers
    if answers.select{|a|not a._destroy}.size > 10
      errors.add(:answers, 'Too many answers')
    end
  end

这按预期工作。

于 2013-03-20T14:04:45.923 回答
0

has_many 关联支持选项 :limit,如果我正确阅读了您的问题,它应该会限制您的结果。

于 2013-03-20T12:21:49.837 回答