Как правильно отобразить DBIx :: Class ResultSet в моем проекте Catalyst, который использует Template Toolkit? - PullRequest
10 голосов
/ 15 января 2009

Учитывая набор результатов DBIx :: Class, например:

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

уроки, которые я прочитал, используют тайник для передачи массива строк:

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

Это приводит к тому, что запрос выполняется в этот момент, и результирующие объекты помещаются в хранилище, поэтому их можно использовать в TemplateToolkit как:

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

Есть ли правильный способ, чтобы TT перебирал строки по мере их извлечения из БД?

Ответы [ 4 ]

19 голосов
/ 15 января 2009

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

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

... а затем:

[% WHILE (card = cards.next) %]
    [% card.given_name %] [% card.family_name %]
[% END %]
5 голосов
/ 23 июня 2009

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

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

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

[% FOREACH card = cards %]
    [% card.given_name %] [% card.family_name %]
[% END %]
2 голосов
/ 30 марта 2010

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

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

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

2 голосов
/ 13 августа 2009

Я делаю:

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

В шаблоне:

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