例えば、Userが持てるPostの数を制限したいときは、Post側にvalidateを設定します。
user.rb
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
post.rb
class Post < ActiveRecord::Base
MAX_POSTS_COUNT = 5
belongs_to :user
validate :posts_count_must_be_within_limit
private
def posts_count_must_be_within_limit
errors.add(:base, "posts count limit: #{MAX_POSTS_COUNT}") if user.posts.count >= MAX_POSTS_COUNT
end
end
これで、6個目のPostを作成しようとするとエラーになります。
ちなみに、Userにvalidateを定義した場合はUserをsaveしたときにvalidateが走ります。
つまり、Postのsave時にvalidateが効かず、6個目のPostを作れてしまうのでNGです。
user.rb
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
validates :posts, length: { maximum: 5 } # ←これでは`user.posts.create`のときに動かず、6個目のPostを作成できてしまう
end
環境
- Ruby: 2.6.3
- Rails: 6.0.2.2