has_many
@RadBrad は、 3 つのバナーのセットを表す別のモデルで使用できる点を強調しています。たぶん、BannerSet などと呼ぶことができます。彼が言ったように 3 つを一度に作成するか、BannerSet 検証で 3 つのバナーのみが関連付けられていることを確認できます。
また、バナーの 3 つの ID を持つ BannerSet モデルに 3 つの属性 (列) を持つこともできます。常に 3 つのバナーであると確信している場合は、それも優れたデザインである可能性があります。
ただし、Banner 用のコントローラーしかない場合の方法は次のとおりです。これは、後でわかるように、最善の方法ではありません。
まず、コントローラーで宣言型承認を使用する可能性があります。
authorization do
has_permission_on :banners, :to => [:new, :create] do
Banner.count < 3
end
end
バナーを追加するために作成画面に到達した後に追加された場合でも、バナーを追加できないようにするには、Banner モデルに検証も追加します。
before_create :validate_max_banners
def validate_max_banners
errors.add_to_base("Only 3 banners are allowed.") if Banner.count == 3
errors.empty?
end
ただし、そのテーブルに3行しか持てないことを完全に保証することはできません。これを行うには、この q&aで説明されているように、DB 側でトリガーなどが必要になります。しかし、基本的な解決策としては、それで問題ないかもしれません。
RailsAdminは非常に簡単に構成およびカスタマイズできますが (ドキュメントについては、そのwikiを参照してください)、さらに多くのカスタマイズが必要な場合は、 ActiveAdmin の使用も検討します。