perl catalyst template-toolkit dbix-class

perl - ¿Cuál es la forma correcta de mostrar un DBIx:: Class ResultSet en mi proyecto Catalyst que usa Template Toolkit?



template-toolkit dbix-class (4)

Dado un resultado DBIx :: Class, por ejemplo:

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

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

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

Esto hace que la consulta se ejecute en este punto y que los objetos resultantes se almacenen en el alijo, para que puedan ser utilizados en TemplateToolkit como:

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

¿Hay una forma adecuada de hacer que TT itere sobre las filas a medida que se obtienen de la base de datos?


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

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

...y entonces:

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


O mejor:

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

... en la plantilla TT:

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


Hago:

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

En la plantilla:

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


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. (El beneficio clave 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, procesamiento o 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.