web-dev-qa-db-fra.com

Rails - Validez la présence de l'association?

J'ai un modèle A qui a une association "has_many" avec un autre modèle B. J'ai une exigence professionnelle selon laquelle l'insertion dans A requiert au moins 1 enregistrement associé à B. Existe-t-il une méthode que je peux appeler pour m'assurer que cela est vrai, ou dois-je écrire une validation personnalisée?

101
skaz

Vous pouvez utiliser validates_presence_ofhttp://apidock.com/Rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base
  has_many :bs
  validates_presence_of :bs
end

ou simplement validateshttp://apidock.com/Rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base
  has_many :bs
  validates :bs, :presence => true
end

Mais il y a un bug avec si vous utilisez accepts_nested_attributes_for avec :allow_destroy => true: Modèles imbriqués et validation parent . Dans cette rubrique, vous pouvez trouver une solution.

156
fl00r

-------- Rails 4 ------------

Simple validatespresence a travaillé pour moi

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Par ici, Profile.create va maintenant échouer. Je dois utiliser user.create_profile ou associer un utilisateur avant de sauvegarder un profile.

16
hexinpeter

Vous pouvez valider les associations avec validates_existence_of (qui est un plugin):

Exemple d'extrait de cette entrée de blog :

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
  validates_existence_of :tag, :taggable

  belongs_to :user
  validates_existence_of :user, :allow_nil => true
end

Vous pouvez aussi utiliser validates_associated . Comme Faisal note dans les commentaires en dessous de la réponse, validates_associated vérifie si l'objet associé est valide en exécutant les validations de classe associées. Il ne vérifie pas la présence . Il est également important de noter qu'une association nulle est considérée comme valide.

6
Spyros

Si vous voulez vous assurer que l'association est à la fois présente et garantie d'être valide, vous devez également utiliser

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end
1
Sukeerthi Adiga