Какой правильный способ отобразить DBIx:: Class ResultSet в моем проекте Catalyst, который использует Template Toolkit?

С учетом набора результатов 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-итерацию по строкам, поскольку они извлекаются из БД?

Ответ 1

Конечно. Вы можете передать набор результатов непосредственно в TT и перебрать его в шаблон.

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

... и затем:

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

Ответ 2

Или еще лучше:

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

... в шаблоне TT:

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

Ответ 3

Я делаю:

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

В шаблоне:

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

Ответ 4

Я делал то же самое, что и автор.

При попытке создать более строгий подход MVC я теперь обрабатываю объекты DBIC в контроллере и передаю очень простой файл для отображения шаблона. (Ключевым преимуществом является то, что код используется повторно для других сценариев, а не только для веб-интерфейса.)

Мне любопытно, знает ли кто-нибудь, эффективнее это или нет, обрабатывается или запоминается. Я бы подумал, что первый метод приводит к меньшему времени обработки, но сохраняется в памяти дольше. Я предполагаю, что мой новый подход требует немного большей обработки и немного больше памяти временно, но потенциально большой объект набора результатов не так долго.