ドキュメントが見つからない「単純な」レールの問題があり、誰かが私を正しい方向に向けてくれることを願っています。
状態属性を持つカテゴリと呼ばれるモデルがあります。「無効」とは異なる状態のすべてのレコード間で、カテゴリ名の一意性を検証できるようにしたいと考えています。
これを達成するために、今私はカスタムバリデーターを作成しましたが、それを達成するための組み込みオプションがあると思います。私は正しいですか?
ありがとう。
ドキュメントが見つからない「単純な」レールの問題があり、誰かが私を正しい方向に向けてくれることを願っています。
状態属性を持つカテゴリと呼ばれるモデルがあります。「無効」とは異なる状態のすべてのレコード間で、カテゴリ名の一意性を検証できるようにしたいと考えています。
これを達成するために、今私はカスタムバリデーターを作成しましたが、それを達成するための組み込みオプションがあると思います。私は正しいですか?
ありがとう。
条件付き検証を見たいと思うかもしれません。たとえば、.not_void?
モデルにメソッドがある場合、次を使用できます。
validates :category, uniqueness: true, if: :not_void?
eval
文字列 ( 'dを取得) または proc を使用するオプションもあります。詳細については、検証ガイドをご覧ください。
編集:明確な質問に基づく新しい回答
私の理解では、無効ではない状態全体で一意性を検証する必要があるため、組み込みのバリデーターで目的を達成するのは少し難しいかもしれません。このオプションを使用して:scope
、レコードの一意性を判断する制限をチェックすることができるため、テーブルにブール値フィールドを追加して、それを使用して一意性を判断することができます。たとえば、void
テーブル/モデルに属性を追加した場合、必要な動作を得ることができます
# category.rb
before_validation :set_void
def set_void
self.void = (state == "void")
end
validates :category, uniqueness: { scope: :void }, unless: :void
これにより、検証前に属性が自動的に更新void
され、カテゴリの名前が他のすべての無効でないカテゴリと比較して一意であることが検証されます (そのカテゴリ自体の状態が無効でない限り)。