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

これを解決しました。DBで回答のみをカウントしていた理由は、.sizeではなく.countを使用したためです。

私の場合、破棄のマークが付けられた回答も割引する必要があります。したがって、質問の検証は次のようになります。

  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 に答える