validates on: :destroy
Discussion
解決したいこと
user.destroy
実行時に、ユーザーが管理者権限になっている場合は削除できないという要件(バリデーション)を実装したいと考えています。
before_destroy
で false
を返す以外に良い方法はありますか?
発生している問題・エラー
以下の様に書きたいのですが、on: :destroy
などの記述はできない(用意されていない)と思います。
enum account_type: {
viewer: 'viewer',
administrator: 'administrator'
}
with_options on: :destroy do
validates :account_type, exclusion: { in: %w(administrator) }
end
before_destroy
コールバックで false
を返すと実現できる様なのですが、以下の理由で他の方法を探しています。
- コールバックにロジックが記述されているのは良くないという記事を見たことがあります。
- バリデーションっぽいのでコールバックとして書きたくない
他にいい方法はありますでしょうか。
あるいは、オプションが無いということは削除を弾くという考え方(設計?)がよろしくないかもね、という事なのでしょうか?
(権限があってできることが異なる場合、それは同じモデルとして扱うのは良くないよね、など)