83 votes

Meilleure pratique concernant l'association belongs_to vide

Imaginez la situation suivante :

J'ai un dog et un modèle de house modèle. Un chien peut appartenir à une maison, et une maison peut avoir plusieurs chiens :

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end

Imaginez maintenant que je veuille aussi créer des chiens qui n'ont pas de maison. Ils n'appartiennent pas à une maison. Puis-je toujours utiliser cette structure de relation et simplement ne pas informer un :house_id lors de sa création ?

Existe-t-il une meilleure pratique ?

Obs : J'ai utilisé cette analogie pour simplifier mon problème, mais ma situation réelle est la suivante : j'ai un modèle dont un utilisateur peut générer des instances. Il peut également créer des collections de ces instances, mais il peut laisser une instance en dehors d'une collection.

350voto

Wibbly Points 3711

Attention avec Rails 5...

belongs_to est obligatoire par défaut

A partir de maintenant, chaque application Rails aura une nouvelle configuration option config.active_record.belongs_to_required_by_default = true , il déclenchera une erreur de validation lors de l'enregistrement d'un modèle dans lequel belongs_to ne sont pas présentes.

config.active_record.belongs_to_required_by_default peut être remplacée par false et conserver ainsi l'ancien comportement de Rails, ou nous pouvons désactiver ceci sur chaque belongs_to en passant simplement un supplémentaire. optional: true comme suit :

class Book < ActiveRecord::Base
  belongs_to :author, optional: true
end

de : https://sipsandbits.com/2015/09/21/whats-new-in-rails-5/#belongs_toisrequiredbydefault

27voto

Flexoid Points 2730

Je pense que c'est une approche tout à fait normale.

Vous pouvez laisser house_id con null dans la base de données pour les modèles qui n'appartiennent pas à d'autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X