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?
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 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.
-------- Rails 4 ------------
Simple validates
presence
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
.
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.
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