2009-01-15 7 views
10

Dado un conjunto de resultados :: DBIx clase, por ejemplo:¿Cuál es la forma correcta de mostrar un DBIx :: Class ResultSet en mi proyecto Catalyst que usa Template Toolkit?

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

los tutoriales que he leído utilizar el alijo que pasar un arrayref de filas:

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

Esto da lugar a la consulta de la silla eléctrica en este punto, y los objetos resultantes metidos en el alijo, para que puedan ser utilizados en TemplateToolkit como:

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

¿hay una manera correcta para tener iterate TT sobre las filas a medida que se obtienen de la base de datos?

Respuesta

19

Sure. Puede pasar el conjunto de resultados directamente a TT e iterar sobre él en la plantilla.

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

... y luego:

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

O, aún mejor:

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

... en la plantilla TT:

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

¿Funciona? - FOREACH toma una matriz, no un conjunto de registros, ¿no? – Thelema

+0

Estaba luchando mucho pero estaba usando [% FOREACH foo IN foos%] pero veo que [% FOREACH foo = foos%] funciona bien;) – nicomen

2

hago:

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

En la plantilla:

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

memoria hambrienta con un gran conjunto de resultados. – singingfish

+0

Sí, esto se da como código de ejemplo, pero no es muy eficiente – Thelema

2

que estaba haciendo exactamente lo mismo que el autor.

Al tratar de crear un enfoque MVC más estricto, ahora estoy procesando los objetos DBIC en el controlador y pasando un alijo muy simple para que se muestre la plantilla. (La ventaja principal es que el código es reutilizable por otros scripts en lugar de solo la interfaz web.)

Tengo curiosidad si alguien sabe si esto es más eficiente o no, procesando o sabiendo en memoria. Creo que el primer método da como resultado menos tiempo de procesamiento, pero se mantiene en la memoria por más tiempo. Supongo que mi nuevo enfoque requiere un poco más de procesamiento y un poco más de memoria temporalmente, pero el objeto potencialmente grande del conjunto de resultados no dura tanto tiempo.

Cuestiones relacionadas