[Dbix-class] Is it possible to use "dumb" result classes with DBIx::Class?

Will Crawford billcrawford1970 at gmail.com
Thu Apr 9 15:08:39 GMT 2015


It's easy enough to override inflate_result, like so:

{
    package My::HRI::Subclass;
    use Moose;
    BEGIN { extends 'DBIx::Class::ResultClass::HashRefInflator'; }
    sub inflate_result { bless shift->maybe::next::method(@_); }
    sub TO_JSON
    {
            my $self = shift;
            return { %$self };
    }
}

my $users = $schema->resultset('User');
my $me = $users->find( $my_user_id, {
    result_class => 'My::HRI::Subclass'
} );

Dwarn $me->TO_JSON;


On 9 April 2015 at 16:00, Lasse Makholm <lasse at unity3d.com> wrote:

>
>
> On Thu, Apr 9, 2015 at 4:57 PM, Will Crawford <billcrawford1970 at gmail.com>
> wrote:
>
>> You _should_ just be able to subclass the HRI class and add those methods
>> (and pass { result_class => 'My::HRI::Subclass' } in for the RS
>> attributes). I haven't tested this, will do in a moment :)
>>
>
> Yeah, the problem seems to returning a blessed object from inflate_result,
> because then DBIx::Class thinks "Ooh! A real row object! I can do all sort
> of things with this!" Which it can't, so BOOM! :-)
>
> /L
>
>>
>> On 9 April 2015 at 14:58, Lasse Makholm <lasse at unity3d.com> wrote:
>>
>>> I'm using DBIx::Class::ResultClass::HashRefInflator in some places where
>>> full row object inflation is too slow. That's fine.
>>>
>>> What I'd really like to do though, is bless the resulting hashrefs into
>>> a "light weight" result class that provides a few convenience methods but
>>> knows little to nothing about DBIx::Class.
>>>
>>> Trying something like:
>>>
>>> my $rs = $schema->resultset('MyTable')->search(...);
>>> $rs->result_class('MyApp::Schema::DumbResult::MyTable');
>>> while (my $thingy = $rs->next) {
>>>
>>> # do, do, do
>>>
>>> }
>>>
>>>
>>> with something like:
>>>
>>> package MyApp::Schema::DumbResult::MyTable;
>>>
>>> use strict;
>>> use warnings;
>>>
>>> use DBIx::Class::ResultClass::HashRefInflator;
>>>
>>> sub inflate_result
>>> {
>>> my $class = shift;
>>> my $result =
>>> DBIx::Class::ResultClass::HashRefInflator->inflate_result(@_);
>>> return bless $result, $class;
>>> }
>>>
>>> sub TO_JSON
>>> {
>>> my $self = shift;
>>> return { %$self };
>>> }
>>>
>>> 1;
>>>
>>>
>>> ...breaks for a variety of reasons it seems, because DBIx::Class wants
>>> to do things like setting a result source instance on the result object,
>>> etc...
>>>
>>> Is there an (easy) make this work? Or is it just in general a horrible
>>> idea?
>>>
>>> Of course I can just do:
>>>
>>> $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
>>> my @stuff = map { bless $_, MyApp::Schema::DumbResult::MyTable }
>>> $rs->all;
>>>
>>> ...but the other way is more convenient...
>>>
>>> Or is it more sane to subclass the ResultSet and override first(), all()
>>> and next() to set the result_class and bless the resulting hashrefs?
>>>
>>> Any input appreciated?
>>>
>>> /L
>>>
>>>
>>>
>>> _______________________________________________
>>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
>>> IRC: irc.perl.org#dbix-class
>>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
>>> Searchable Archive:
>>> http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
>>>
>>
>>
>> _______________________________________________
>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
>> IRC: irc.perl.org#dbix-class
>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
>> Searchable Archive:
>> http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
>>
>
>
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive:
> http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20150409/d29cba9a/attachment.htm>


More information about the DBIx-Class mailing list