QA@IT

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

6876 PV

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)
ウォッチ

この質問への回答やコメントをメールでお知らせします。