2010-10-05 5 views
1

J'ai trois classes: Mix, MixClip et Clip. MixClip joint les tables Mix/Clip et inclut une propriété supplémentaire pour décrire le clip (ordre). Je voudrais savoir s'il est possible d'avoir un objet clip et être en mesure de référencer le clip en cours dans le contexte, il a été chargé dansRecherche d'une valeur dans une table de jointure et une association DataMapper

Alors disons que je charge un mélange et un clip comme ceci:.

mix = Mix.first 
clip = mix.clips.first 

Existe-t-il un moyen d'obtenir le MixClip associé à ce clip spécifique?

clip.mix_clip.order 

Il a été chargé par jointure entre la table, donc je pense qu'il y aurait un moyen de le faire.

Je sais que je peux juste obtenir tous les mix-> mix-> clips-> et et descendre, mais je me demandais si je serais capable de remonter les niveaux ... ce serait plus simple. Pour ceux qui se le demandent, j'essaye d'utiliser ceci parce que dm-serializer ne supporte pas complètement les associations imbriquées quand je retourne json/xml et j'aimerais juste pouvoir définir une méthode qui renvoie les données .

Merci.

Répondre

2

sans changer votre code, vous devriez être en mesure de le faire:

mix_clip = clip.mix_clips.first(:mix => mix, :clip => clip) 

pour obtenir à la jointure enregistrement associé à vos mix et clip spécifiques des ressources.

Actuellement, il y a un bogue dans DM qui le rend un peu peu fiable pour faire ce qui suit sans mesures supplémentaires:

mix_clip = clip.mix_clips.get(mix.id, clip.id) 

En effet, DM oublie l'ordre dans lequel les relations ont été définies, et peuvent donc pas connaître de manière fiable dans quel ordre la méthode .get doit accepter les composants de clé primaire.

Vous pouvez contourner ce problème en définissant les propriétés clés étrangères explicitement dans la jointure modèle, comme si (notez que vous devez toujours déclarer les relations explicitement, bien sûr):

class MixClip 
    include DataMapper::Resource 

    property :id,  Serial 
    property :order, Integer  

    property :mix_id, Integer, :key => true 
    property :clip_id, Integer, :key => true 

    belongs_to :mix 
    belongs_to :clip 
end 

Cela fera en sorte que DM sait que .get accepte la clé primaire comme (mix_id, clip_id) si vous êtes maintenant en mesure d'appeler

mix_clip = clip.mix_clips.get(mix.id, clip.id) 

Une raison de vouloir le faire est que les appels à .get prendre la carte d'identité en compte, ce qui, sur la base sur vos caractéristiques d'accès, pourrait être en mesure de donner de meilleures performances.

Questions connexes