Rails has_one vs belongs_to sémantique
J'ai un modèle représentant un Content
élément qui contient certaines images. Le nombre d'images fixes et ces références sur l'image sont très spécifiques au contenu. Par exemple, le Content
modèle se réfère à la Image
modèle à deux reprises (profil d'image, et l'image de fond). Je suis en essayant d'éviter un générique has_many
, et le coller à plusieurs has_one
s'. L'actuelle structure de base de données ressemble à:
contents
- id:integer
- integer:profile_image_id
- integer:background_image_id
images
- integer:id
- string:filename
- integer:content_id
Je ne peux pas comprendre comment le programme d'installation de la associations correctement ici. Le Content
modèle pourrait contenir deux belongs_to
les références à un Image
, mais ça ne semble pas sémantiquement juste cause idéalement une image appartient au contenu, ou en d'autres termes, le contenu dispose de deux images.
C'est le mieux que je pouvais penser (par rupture de la sémantique):
class Content
belongs_to :profile_image, :class_name => 'Image', :foreign_key => 'profile_image_id'
belongs_to :background_image, :class_name => 'Image', :foreign_key => 'background_image_id'
end
Suis-je, " et il y a une meilleure façon de parvenir à cette association?
Vous devez vous connecter pour publier un commentaire.
La réponse est simple, pour l'installation de vos associations dans le sens inverse de ce que vous avez, comme suit:
Vous n'avez pas besoin de la clé étrangère 'background_image_id" et "profile_image_id" dans le contenu de la table à tous.
Cependant, il y a une solution plus élégante: unique de l'héritage de table. Configurer maintenant dans le cas où vous voulez l'arrière-plan et les images de profil pour se comporter de la même façon légèrement différente dans l'avenir, plus il permettra de clarifier votre code aujourd'hui.
D'abord, ajouter une colonne à votre table images du type:
Maintenant le programme d'installation de vos modèles comme ceci:
Maintenant, vous pouvez faire toutes sortes de choses comme obtenir une liste de toutes les images d'arrière-plan:
Ceci est plus vrai pour le modèle de données que vous essayez de créer, permet la meilleure évolutivité dans le futur, et vous donne quelques frais de nouvelles méthodes d'aujourd'hui.
Mise à JOUR:
Depuis, j'ai créé un article de blog appelé Seul l'Héritage de Table avec des Tests qui va plus dans le détail, et couvre les essais.
Basé sur l'AR associations guide, je pense que vous devriez utiliser
has_one
. Il ne fait pas de sens pour une image de posséder un Contenu... le Contenu sûrement propriétaire de l'image. À partir du guide:Enfin, je ne suis pas sûr que vous devez à la fois les contenus et les images pour avoir les clés étrangères. Tant que les images de références de la content_id, je pense que vous allez bien.