QA@IT

Railsで任意のValidateを設定するには?

Blogの各記事に複数のCommentsを付けられるようにしていて、
Commentsの投稿数に上限を設けるにはどうしたら良いでしょうか?(例えば、コメント投稿数上限を5として6個目を投稿しようとするとエラーになる)

どなたかご存知の方、以下について教えて頂けますでしょうか?

  1. 上記の制限を設ける場合、Model内のcomment.rbにvalidateを設定するというやり方で良いでしょうか?
  2. 仮にそうだとして、validateにはどのように記述すれば良いでしょうか?

Railsの書籍などを読んでも知識不足の為かよくわからず、どなたか教えて頂ければ幸いです。
どうぞよろしくお願いいたします。

回答

comment.rb に validate クラスメソッドを使って書けばよいと思います。

class Comment < ActiveRecord::Base
  belongs_to :article

  # 作成時 (create) のみ実行
  validate on: :create do
    # 既存のコメント数を調べて...
    if article && article.comments.count > 5
      # validation に失敗したら errors.add を呼ぶ
      errors.add(:article, :has_too_many_comments)
    end
  end
end

ブロックでなくメソッドで書く事もできます。

class Comment < ActiveRecord::Base
  belongs_to :article

  # 第 1 引数にメソッド名をシンボルで指定
  validate :article_has_too_many_comments, on: :create

  def article_has_too_many_comments
    if article && article.comments.count > 5
      errors.add(:article, :has_too_many_comments)
    end
  end
end

ただし、上記の例だと、ほぼ同時にコメントが投稿された場合に validation を通ってしまう恐れがあるので、厳密にチェックするならおそらくテーブルのロックが必要です。

編集 履歴 (1)
  • labochoさん ありがとうございます。 こちらの方法で無事解決しました。 ちなみに、`errors.add`などはrubyもしくはrailsのドキュメントのどの辺りを参照すれば良いでしょうか・・・ -
  • RailsGuide (http://guides.rubyonrails.org/active_record_validations_callbacks.html#errors-add) に説明があります。ドキュメントも見ておいてもいいかもしれません (http://api.rubyonrails.org/classes/ActiveModel/Errors.html)。 -

この質問に回答する


この質問の答えをご存知ですか? ぜひ質問者に伝えてあげてください (サインインすると、回答フォームが表示されます)。

サインイン