4

管理者ユーザー向けに条件付き検証をグループ化するために with_options を使用しようとしています。ユーザー名の一意性に関する 2 番目の検証では、with_options 条件が上書きされます。

これを行うより良い方法はありますか?それとも、with_options のことは忘れて、2 つの別々のステートメントを作成する必要がありますか?

with_options :if => Proc.new { |user| user.admin? } do |admin|
  admin.validates :email, :presence => true
  admin.validates :username, :uniqueness => true, :if => Proc.new { |user| user.category == "customized_username" }
end
4

3 に答える 3

1

これらの2つの検証しかない場合は、with_optionsブロックを削除して、各検証に条件を直接追加することは悪い考えではないと思います。

admin.validates :email, :presence => true, :if => Proc.new { |user| user.admin? }
admin.validates :username, :uniqueness => true, :if => Proc.new { |user| user.admin? && user.category == "customized_username" }

考慮したいもう1つのことは、ブールフィールドを使用する代わりに単一テーブル継承(STI)です。アプリケーション全体で実行していることに気付いた場合は、これをお勧めuser.admin?します。STIを使用すると、通常のユーザーと管理者ユーザーが存在し、それぞれにクラスごとに異なるロジックを含めることができます。行う必要がある唯一の実際の変更は、「admin」フィールドを「type」に変更し、それを文字列にすることです。

class User < ActiveRecord::Base
end

class AdminUser < User
  validates :email, :presence => true
  validates :username, :uniqueness => true, :if => Proc.new { |user| user.category == "customized_username" }
end
于 2012-12-14T09:18:12.020 に答える
0

2 行を使用する必要がありますが、Proc で同じロジックを繰り返すよりもメソッドを使用する方がクリーンです。

validates :email, :presence => true, :if => :admin?
validates :username, :uniqueness => true, :if => [:admin?, :custom_user?]

def custom_user?
   category == "customized_username"
end
于 2014-11-07T01:01:18.533 に答える