0

Je travaille sur un projet où de nombreux modèles ActiveRecord peuvent avoir une conversation associée. Les utilisateurs peuvent discuter à peu près tous les aspects du site. J'ai deux idées sur la façon dont cela devrait être mis en œuvre.RoR: Devrais-je utiliser belongs_to,: polymorphic dans ce scénario?

1) Utilisez un belongs_to dans l'actif, et non pas la conversation - conversation totalement pas au courant de son actif

class Product< ActiveRecord::Base 
    belongs_to :conversation 
end 

class PurchaseOrder < ActiveRecord::Base 
    belongs_to :conversation 
end 

2) Utilisez un belongs_to,: polymorphes => true dans la conversation

class Conversation < ActiveRecord::Base 
    belongs_to :asset, :polymorphic => true 
end 

class Product < ActiveRecord::Base 
    has_one :conversation, :as => :asset 
end 

class PurchaseOrder < ActiveRecord::Base 
    has_one :conversation, :as => :asset 
end 

Quelle est la bonne façon de modéliser cette relation? Si je devais dire la relation, je dirais que "un produit/commande d'achat peut avoir une conversation".

Répondre

0

Je pense que cela dépend de ce que, si quelque chose, un modèle dans la relation doit connaître l'autre. Il me semble, d'après votre description, que la seconde approche la plus appropriée dans ce cas. Pourquoi?

  • Les modèles Product et PurchaseOrder sont des entités autonomes contrained dans le sens où ils peuvent exister en dehors des conversations à leur sujet. Donc, vous ne voulez probablement pas de clés étrangères qui polluent ces modèles pour virer des conversations. La relation devrait être discrète dans ce sens.
  • Un Conversation a une dépendance logique sur l'entité elle est associée il a les asset_id (et asset_type) clés étrangères et qui est probablement raisonnable

Ceci est une question très commune et qui m'a toujours arrêter à pense un peu aussi. Ce n'est pas toujours évident. Il y a un bon article considérant le problème here

+0

Grande réponse. Merci pour votre perspicacité. –

Questions connexes