Ответ 1
Конечно. Вы можете передать набор результатов непосредственно в TT и перебрать его в шаблон.
$c->stash->{cards} = $rs;
... и затем:
[% WHILE (card = cards.next) %]
[% card.given_name %] [% card.family_name %]
[% END %]
С учетом набора результатов DBIx:: Class, например:
my $rs = $c->model("DB::Card")->search({family_name => "Smith"});
учебники, которые я прочитал, используют stash для передачи массива строк:
$c->stash->{cards} = [$rs->all];
Это приводит к выполнению запроса в этот момент и к результирующим объектам, помещенным в stash, поэтому их можно использовать в TemplateToolkit как:
[% FOREACH card IN cards %]
[% card.given_name %] [% card.family_name %]
[%END%]
Есть ли правильный способ иметь TT-итерацию по строкам, поскольку они извлекаются из БД?
Конечно. Вы можете передать набор результатов непосредственно в TT и перебрать его в шаблон.
$c->stash->{cards} = $rs;
... и затем:
[% WHILE (card = cards.next) %]
[% card.given_name %] [% card.family_name %]
[% END %]
Или еще лучше:
$c->stash(cards => $rs);
... в шаблоне TT:
[% FOREACH card = cards %]
[% card.given_name %] [% card.family_name %]
[% END %]
Я делаю:
@{$c->stash->{cards}} = $rs->all;
В шаблоне:
[% FOREACH card IN cards %]
[% card.given_name %] [% card.family_name %]
[% END %]
Я делал то же самое, что и автор.
При попытке создать более строгий подход MVC я теперь обрабатываю объекты DBIC в контроллере и передаю очень простой файл для отображения шаблона. (Ключевым преимуществом является то, что код используется повторно для других сценариев, а не только для веб-интерфейса.)
Мне любопытно, знает ли кто-нибудь, эффективнее это или нет, обрабатывается или запоминается. Я бы подумал, что первый метод приводит к меньшему времени обработки, но сохраняется в памяти дольше. Я предполагаю, что мой новый подход требует немного большей обработки и немного больше памяти временно, но потенциально большой объект набора результатов не так долго.