2009-03-13 9 views
2

Je voudrais avoir des fonctionnalités comme ceci:Puis-je avoir une relation "Parent has_many GrandChildren through Children" dans DBIx :: Class?

$parent->get_grandchildren_by_category({category => 'foo'}); 

je peux le faire facilement en dehors de la classe parente avec un simple enchaîné rejoindre:

$schema->resultset('Parent')->search(
    { 
     'me.id' => 62, 
     'grandchildren.category' => 'foo' 
    }, 
    { 
     join => {'children' => 'grandchildren'} 
    } 
); 

Mais à l'intérieur de la classe parente Je ne t ont accès (et ne devraient pas) à l'objet de schéma. A l'intérieur de la classe parent, je peux accéder à $self->children mais cela retourne un jeu de résultats d'enfants, et je dois les parcourir pour obtenir grandchildren.

Y a-t-il un moyen de définir ce style ActiveRecord?

class Parent < ActiveRecord::Base 
    has_many :children 
    has_many :grandchildren, :through => :children 
end 

Répondre

1

j'ai eu beaucoup d'aide de #dbix-class. Il n'est peut-être pas possible de définir explicitement un style de relation ActiveRecord :through, mais il existe un moyen de récupérer les enfants plus bas dans la chaîne de résultats.

En utilisant la méthode search_related de ResultSet, vous pouvez accéder à une relation et utiliser les accesseurs de l'enfant. Par exemple, dans ma classe parent:

sub get_grandchildren_by_category{ 
    my ($self, $category) = @_; 
    my @gchildren = $self->children->search_related('grandchildren' 
     { 
      'grandchildren.category' => $category 
     } 
    ); 

    return \@gchildren; 
} 

Depuis search_related renvoie un resultset, je suppose que vous pourriez enchaînez les search_related appelle aussi loin que vous le souhaitez.

+0

Je peux me tromper ici, mais le «_rs» représente habituellement un resultset. @gchild_rs est en fait une collection d'objets ligne. Pour éviter toute confusion, appelez-le dans un contexte scalaire ou utilisez search_related_rs au lieu de search_related. – gpojd