6
votes

Associations polymorphes inverses

J'ai un objet parent, post, qui a les enfants suivants.

has_one :link
has_one :picture
has_one :code


1 commentaires

Serait-il logique d'avoir la photo avoir une relation: has_many? Ensuite, vous pourriez faire ce que vous cherchez ..


3 Réponses :


0
votes

Je pense que vous recherchez l'option : comme pour has_one . Il vous permet de spécifier le nom du appartiens_to Association Fin.

Lorsque tout le reste échoue, lisez les docs: http://apidock.com/ Rails / Activerecord / Associations / ClassMethods / HAS_ONE


1 commentaires

Peut-être que je manque quelque chose, mais comment créerais-je une association dynamique avec un enfant en utilisant: comme? Je comprends le polymorphisme en ce qui concerne la manière dont un objet enfant pourrait avoir n'importe quel type d'objet parent. Mais ce que je demande, c'est comment un objet parent peut avoir n'importe quel type d'objet enfant. Je veux faire quelque chose comme @ Post.Postable et obtenir l'objet enfant, qui serait l'un des liens, des images ou du code.



0
votes

Y a-t-il un moyen d'utiliser polymorphe associations à l'inverse afin que je ne pas avoir à avoir link_id, picture_id et code_id champs dans mon Table de poste? P>

has_one code> implique que la clé étrangère est dans la table autre em>. Si vous avez vraiment défini votre modèle de cette façon, vous n'aurez pas link_id code>, image_id code> et code_id code> dans votre table de poste. Je pense que vous vouliez dire appartient à l'adresse_to code>. P>

Je veux faire quelque chose comme @ post.postable et obtenez l'enfant objet, qui serait l'un des liens, image ou code. p> blockquote>

Je pense que vous pouvez le faire en utilisant STI et en combinant les liens liens code>, images images code> et codes code> Tables, puis test le type du modèle lors de la récupération. Cela semble karserie cependant, et pourrait se retrouver avec beaucoup de colonnes inutilisées. P>

est une raison de ne pas stocker les colonnes d'identité inutilisées, autres que d'économiser de l'espace? Si vous êtes prêt à les conserver, vous pouvez définir un attribut virtuel et une colonne postabling_type code>: (code non testé, peut échouer de manière spectaculaire) em> p>

def postable
  self.send(self.postable_type)
end

def postable=(p)
  self.send(postable_type.to_s+"=",p)
end


1 commentaires

Je cherche juste une façon plus élégante de faire des choses que d'avoir plusieurs * _idonnes. Bien que ce fil se révèle, l'approche multiple * _id est probablement la plus simple et la meilleure.



9
votes

J'ai écrit un petit gist montrant comment faire cela: https://gist.github.com/1242485


0 commentaires