Question

Salut à tous, j'ai quelque chose d'une exigence intéressante pour mon projet. J'ai besoin d'une relation de has_one où il est soit une classe ou l'autre, mais sans héritage. Je pourrais sortir avec l'héritage si elle est la seule façon, mais les deux enregistrements associés ont des données complètement différentes et ne sont pas liés du tout.

Ce que je dois comprendre est quelque chose comme ce qui suit.

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
#    related in either data or implementation.

class Foo < ActiveRecord::Base
  # Attributes: id, name, value
  has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
          # Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
  # Attributes: name,...
end

class Baz < ActiveRecord::Base
  # Attributes: name,...
end

Foo a une affectation, de type soit Bar ou Baz; ils partagent une seule colonne commune, donc je peux peut-être faire un objet parent de celui. Cependant, si je les fais hériter d'un objet commun (lorsque les données qu'ils contiennent sont vraiment des oranges et des pommes) dois-je faire une table pour le dossier? Puis-je obtenir loin peut-être si le dossier est un dossier abstrait, mais les enfants ne sont pas?

Je suppose que maintenant vous pouvez voir ma difficulté. Je suis assez nouveau pour RoR, mais l'aimer jusqu'à présent. Je suis sûr qu'il ya un moyen de contourner cela, mais je vais damné si je ne peux pas savoir ce qu'il est.

Était-ce utile?

La solution

Vous essayez de modéliser quelque chose qui ne correspond pas au paradigme de la base de données relationnelle. Toutes les références dans SQL ont une origine et une cible.

FWIW, des associations polymorphiques est aussi un anti-modèle, car il enfreint cette règle. Il devrait être un indice que c'est une conception cassée lorsque la Documentation indique que vous devez renoncer à une contrainte d'intégrité référentielle pour le faire fonctionner!

Vous avez besoin Foo d'avoir deux relations has_one : l'un à la barre et un à Baz. mettre en œuvre alors une logique de classe pour essayer d'assurer une seule référence est rempli dans une instance de Foo. Autrement dit, des références à Bar et Baz, il faut avoir une valeur et l'autre doit être nul, mais cela est quelque chose pour votre code pour vérifier et appliquer.

Autres conseils

Peut-être une façon de faire, est de créer à a-une associations Foo, Bar et Baz. Ensuite, créez une méthode appelée assignation et l'affectation = qui peut être le seul moyen d'accéder à Bar et Baz. Vous pouvez vérifier lequel des deux has_ones n'est pas nul dans la méthode get et retour celui-là. Dans la méthode d'attribution, vous pouvez bien vérifier quel est le type de la variable passée et définir le bon a-une relation à cet objet et définissez l'autre à zéro. Cela devrait couvrir toutes vos bases sans être trop compliqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top