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

107

J'ai un modèle A qui a une association "has_many" à un autre modèle B.J'ai une exigence commerciale selon laquelle 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 c'est vrai, ou dois-je écrire une validation personnalisée?

skaz
la source

Réponses:

167

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 simplement validates http://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 cela si vous l'utilisez accepts_nested_attributes_foravec :allow_destroy => true: Modèles imbriqués et validation parent . Dans cette rubrique, vous pouvez trouver une solution.

fl00r
la source
18

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

Simple a validates presencefonctionné 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.createva maintenant échouer. Je dois utiliser user.create_profileou associer un utilisateur avant d'enregistrer un fichier profile.

hexinpètre
la source
6

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 Faisal le note dans les commentaires sous la réponse, validates_associatedvé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.

Spyros
la source
4

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
Sukeerthi Adiga
la source
Ne serait-ce pas bien si vous pouviez passer une option supplémentaire à validatesaimer valid: trueau lieu d'avoir à appeler validates_associatedséparément.
Joshua Pinter