[caracas-pm] Extensiones ResultSet y load_namespaces DBIx::Class

Juan Miguel Paredes juan.paredes at gmail.com
Wed Jul 25 06:15:09 PDT 2012


2012/7/23 Alejandro Imass <ait at p2ee.org>:
> Buenos días,
>
> Existen dos mecanismos saludables para  extender las clases generadas
> por DBIx::Class::Schema::Loader
>
> 1) Extender las clases Result directamente debajo del checksum
> 2) Crear un directorio ResultSet paralelo a Result y crear clases con
> el mismo nombre que deriven de DBIx::Class::ResultSet y dejar que
> load_namespaces cargue las dos clases.
>
> Ejemplo:
>
> # tabla.pm creada por Loader depositada en Result
>
> package ns::Schema::Result::tabla;
>
> use base 'DBIx::Class::Core';
>
> ...
>
> # tabla.pm creada por mi en ResultSet
>
> package ns::Schema::ResultSet::tabla;
>
> use base 'DBIx::Class::ResultSet';
>
> sub foo {
>    my $self = shift;
>
> }
> ...
>
>
> $objeto = $schema->resultset('tabla')->find(1);
>
> # esto NO funciona:
> $objeto->foo();
>
> # sino la forma de usarlo es así:
>
> $schema->resultset('tabla')->foo();

De hecho, el método "foo" ha sido creado en una extensión del
ResultSet, y en tu caso, $objeto es una instancia de Result, por eso
no funciona $objeto->foo();

En particular, los métodos creados en Result (debajo del checksum como
apuntas) comúnmente se usan como "columnas virtuales" o para
operaciones relacionadas con un objeto particular de la clase Result
(una "fila" de la tabla, coloquialmente).  En cambio, los métodos en
ResultSet son, bueno, como su nombre lo dice, para un conjunto de
resultados.  Por ejemplo, métodos para implementar búsquedas
reutilizables, o incluso para encapsular la lógica de creación del
objeto, si no se hace en otra clase de "negocio".

Así que, las dos formas de extensión que comentas no son equivalentes
entre sí, y cada una tiene su propósito.  Igual que tú, he utilizado
ambas formas, mayormente según lo comentado anteriormente, aunque
según las necesidades, creo que valdría la pena explorar otras
opciones (herencia, como en DBIx::Class::AuditLog, o aprovechando
Moose, como DBIx::Class::QueryLog).

Éxitos!

Juan M. Paredes A.


More information about the caracas-pm mailing list