Valider qu'un objet est associé à une ou plusieurs objets
J'ai besoin de s'assurer que lorsqu'un produit est créé, il a au moins une catégorie.
Je pourrais le faire avec une validation personnalisée de la classe, mais j'espérais qu'il y a une norme plus moyen de le faire.
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories #must have at least 1
end
class Category < ActiveRecord::Base
has_many :product_categories
has_many :products, :through => :product_categories
end
class ProductCategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
- 1. produits + catégories est une excellente occasion de rencontrer
has_and_belongs_to_many
api.rubyonrails.org/classes/ActiveRecord/Associations/.... Vous n'avez pas besoin de joindre le modèle, sauf si vous ne voulez pas stocker des attributs supplémentaires aux côtés de l'association. 2. Vous pouvez utiliser de la réponse à cette question, stackoverflow.com/questions/6429389/... deviner ce que vous avez à changer 🙂
Vous devez vous connecter pour publier un commentaire.
Il existe une validation qui permettra de vérifier la longueur de votre association. Essayez ceci:
it {should validate_length_of(:categories).is_at_least(1)}
mais j'obtiens un message d'erreur indiquant méthode non définie pour chaque chaîne. J'ai été thikning que des tests de la présence pourrait faire l'affaire car il faudrait au moins un enregistrement de là.Garantit qu'il dispose d'au moins une catégorie:
Je trouve le message d'erreur à l'aide de
:presence
est plus clair que l'utilisation delength minimum 1
validationAu lieu de wpgreenway la solution, je vous suggère d'utiliser un crochet de la méthode d'before_save et l'utilisation d'un has_and_belongs_to_many association.
Et à votre avis, l'utilisation peut utiliser par exemple
options_from_collection_for_select