[SP-pm] DBIx::Class - Problema com related data

Nilson Santos Figueiredo Jr. acid06 at gmail.com
Mon Mar 15 19:54:41 PDT 2010


Se eu entendi direito, um erro que (acredito eu) todos que já
desenvolveram com Catalyst + DBIC + TT cometeram pelo menos uma vez.

O TT avalia tudo em contexto lista, por isso está "funcionando". Se
você substituir o código TT, adicionando _rs ao final do método,
provavelmente vai deixar de ter o resultado correto:

  [% teste.locations_translations_rs.coluna_exemplo %]

O que acontece é que as relações do tipo has_many (que eu imagino que
$trow->locations_translations seja) retornam um objeto resultset, que
representa um conjunto de rows. As colunas estão nos objetos rows e
não no resulset.
O que você fazer em seu código Perl é o seguinte:

foreach my $trow (@temp) {
    $c->log->debug($trow->id); # acesso a colunas da tabela principal funciona
    my $translations = $trow->locations_translations;
    for my $translation ($translations->all) {
        $c->log->debug($translation->coluna_exemplo);  # agora deve funcionar
    }
}

Se você realmente quiser apenas os valores das múltiplas colunas de um
resultset, utilize o método get_column() - mas provavelmente não é o
que você quer.

Espero que tenha ficado claro.

-Nilson


2010/3/15 eutsiv :: Geovanny Junio <geovanny at eutsiv.com.br>:
> Olá Companheiros, tudo bem?
>
> Não estou conseguindo resolver um problema com DBIx::Class, com certeza é
> uma cagada muito grande minha, mas apesar de grande ainda não consegui
> enxergar.
> O código é o seguinte:
>
> my $rs = $c->model('UaiGo::Location');
> my @temp = $rs->search(undef, { prefetch => 'location_translations',
> order_by => { -asc => 'name' } })->all();
>
> foreach my $trow (@temp) {
>     $c->log->debug($trow->id); # acesso a colunas da tabela principal
> funciona
>     $c->log->debug($trow->locations_translations->coluna_exemplo);  # acesso
> a colunas da tabela do join não funciona, isso dá o erro: can't locate
> method coluna_exemplo.....
> }
>
> $c->stash->{location} = \@temp;
>
> A linha que coloquei de debug, gera um erro, alegando que o método
> coluna_exemplo não existe. Mas o interessante, é que pelo Template funciona:
>
> [% FOREACH teste IN c.stash.location %]
>     [% teste.locations_translations.coluna_exemplo %] # Imprime o conteúdo
> da coluna corretamente
> [% END %]
>
> Com certeza estou cometendo algum erro infantil, mas já li a documentação e
> o cookbook do DBIx::Class e não consegui resolver.
>
> Grato,
>
> --
> Geovanny Junio
> Consultor de Tecnologia
> geovanny (at) eutsiv.com.br
> +55 31 9422-8885
> +55 31 3393-9132
> www.eutsiv.com.br
>
> Este e-mail pode conter informação privilegiada e confidencial. Se você não
> é destinatário da
> mensagem, por favor apague a mensagem e comunique-nos o fato de imediato.
>
> This e-mail contains information that may be
> privileged and confidential. If you are not the intended recipient, please
> delete the e-mail and notify us immediately.
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


More information about the SaoPaulo-pm mailing list