Skip to content

Instantly share code, notes, and snippets.

@juno
Created November 16, 2014 17:48
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juno/651f58134543a4c68fb1 to your computer and use it in GitHub Desktop.
Save juno/651f58134543a4c68fb1 to your computer and use it in GitHub Desktop.
ActiveRecordモデルにおけるAssociationのバリデーション戦略

ActiveRecordモデルにおけるAssociationのバリデーション戦略

  • foo_idのpresenceでは、存在しないIDでも保存できてしまう
    • fooを参照した際はnilが返る
  • fooのpresenceを指定すると、foo_idへの代入ではバリデーションを通らなくなる
    • fooに未保存のオブジェクトを代入してsave!するとPG::NotNullViolationが発生する
      • PG::NotNullViolation: ERROR: null value in column "character_id" violates not-null constraint
  • Polymorphic association
    • validates :foo_type, presence: trueは不要
      • クラスが存在しない場合はsave!時にNameError: uninitialized constant XXXが発生する
      • 特定のクラス名のみを許可したい場合のみvalidates :foo_type, inclusionをする
    • foo_typefoo_idのpresenceでは、存在しないIDでも保存できてしまう
      • fooを参照した際はnilが返る

Conclusion

  • 関連オブジェクトが保存済みであることを保証するには、validates :foo, presence: trueのみを指定する
  • Polymorphic associationの場合も同様
  • Polymorphic associationで特定のクラスのみを対象としたければinclusion validationを組み合わせる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment