Rails – Valider 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 métier qu’une insertion dans A nécessite 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?

Vous pouvez utiliser validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

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

ou validates simplement http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

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

Mais si vous utilisez accepts_nested_atsortingbutes_for il y a un bug avec :allow_destroy => true : Modèles nesteds et validation parente . Dans cette rubrique, vous pouvez trouver une solution.

——– Rails 4 ————

Simple validates presence travaillé pour moi

 class Profile < ActiveRecord::Base belongs_to :user validates :user, presence: true end class User < ActiveRecord::Base has_one :profile end 

De cette façon, Profile.create va maintenant échouer. Je dois utiliser user.create_profile ou associer un utilisateur avant d'enregistrer un profile .

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 également utiliser validates_associated . Comme le note Faisal dans les commentaires sous la réponse, validates_associated vérifie si l’object associé est valide en exécutant les validations de classes 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.

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

 class Transaction < ActiveRecord::Base belongs_to :bank validates_associated :bank validates :bank, presence: true end