2009-01-15 5 views
10

Compte tenu d'un DBIx :: resultset classe, par exemple:Quelle est la bonne façon d'afficher un ResultSet DBIx :: Class dans mon projet Catalyst qui utilise Template Toolkit?

my $rs = $c->model("DB::Card")->search({family_name => "Smith"}); 

les tutoriels que j'ai lu utiliser la planque pour passer une arrayref de lignes:

$c->stash->{cards} = [$rs->all]; 

Il en résulte la requête CHAISE à ce stade, et les objets résultants bourrés dans la planque, afin qu'ils puissent être utilisés dans TemplateToolkit comme:

[% FOREACH card IN cards %] 
    [% card.given_name %] [% card.family_name %] 
[%END%] 

y at-il une bonne façon d'avoir TT itérer sur les lignes comme ils sont récupérés à partir de la DB?

Répondre

19

Bien sûr. Vous pouvez passer le jeu de résultats directement à TT et le parcourir dans le modèle.

$c->stash->{cards} = $rs; 

... puis:

[% WHILE (card = cards.next) %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
5

Ou, mieux encore:

$c->stash(cards => $rs); 

... dans le modèle TT:

[% FOREACH card = cards %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
+2

Est-ce que cela fonctionne? - FOREACH prend un tableau, pas un jeu d'enregistrements, non? – Thelema

+0

Je luttais beaucoup mais utilisais [% FOREACH foo IN foos%] mais je vois que [% FOREACH foo = foos%] fonctionne très bien;) – nicomen

2

que je fais:

@{$c->stash->{cards}} = $rs->all; 

Dans le modèle:

[% FOREACH card IN cards %] 
    [% card.given_name %] [% card.family_name %] 
[% END %] 
+0

mémoire faim avec un grand resultset. – singingfish

+0

Oui, ceci est donné comme exemple de code, mais n'est pas très efficace – Thelema

2

je faisais exactement la même chose que l'auteur.

En essayant de créer une approche MVC plus stricte, je suis en train de traiter les objets DBIC dans le contrôleur et de passer une stash très simple pour que le template s'affiche. (Le principal avantage étant que le code est réutilisable par d'autres scripts au lieu de simplement l'interface web.)

Je suis curieux de savoir si quelqu'un sait si c'est plus efficace ou pas, en termes de traitement ou de mémoire. Je pense que la première méthode entraîne moins de temps de traitement, mais conserve plus de mémoire. Je suppose que ma nouvelle approche prend un peu plus de temps de traitement et un peu plus de mémoire, mais l'objet de jeu de résultats potentiellement important ne vit pas aussi longtemps.

Questions connexes