[Dbix-class] get_columns and overloaded column accessors

Peter Rabbitson rabbit+dbic at rabbit.us
Fri Oct 22 17:34:55 GMT 2010


Francesc Romà i Frigolé wrote:
> 
> On Wed, Oct 20, 2010 at 2:57 PM, Peter Rabbitson <rabbit+dbic at rabbit.us 
> <mailto:rabbit%2Bdbic at rabbit.us>> wrote:
> 
>     Francesc Romà i Frigolé wrote:
> 
>         Hello,
> 
>         I'm using overloaded column accessors as described in the
>         Cookbok
>         <http://search.cpan.org/%7Efrew/DBIx-Class-0.08123/lib/DBIx/Class/Manual/Cookbook.pod#OVERLOADING_METHODS>.
>         For a given row, I'd like to get a hash with all the column
>         names/value pairs like Row->get_columns returns. However,
>         get_columns returns the actual column values, not the ones
>         created with the custom overloaded accessors.
>         get_inflated_columns behaves the same way.
> 
> 
>     I don't believe you. Here is the implementation of get_inflated_columns
>     from the current CPAN version:
> 
> 
> Thanks Peter for the prompt reply and your explanations. I believe you, 
> but I upgraded to the current CPAN version, and still see the same 
> result with get_inflated_columns, also the same happens in a different 
> computer with an older version (both running different versions of 
> ubuntu). It's very weird, but I haven't yet traced the issue any 
> further, so I can't give you any more insight.


> 
> 
> 
> 
>         Is there a better way of doing this? The reason why I want the
>         hash is to pass the data to my view in a Catalyst application.
> 
> 
>     Use
>     http://search.cpan.org/~frew/DBIx-Class-0.08123/lib/DBIx/Class/ResultClass/HashRefInflator.pm
>     <http://search.cpan.org/%7Efrew/DBIx-Class-0.08123/lib/DBIx/Class/ResultClass/HashRefInflator.pm>
> 
> 
> 
> HashRefInflator does indeed put the values given by the overloaded 
> accessors,

It shouldn't (as per the other reply).

> I might be missing something here, but it seems to me that I can't use 
> HashRefInflator for a specific row, I have to use it for a result set. 

Correct, though you can add HRI as an ttribute to find()

> It's not a big deal, I can just create the hash myself, I'm just 
> concerned I might be doing something wrong.

For what you want to do it would be your best bet.

> 
> 
>  
> 
>         BTW, the documentation of Row->get_column says "Returns a raw
>         column value from the row object, if it has already been fetched
>         from the database or set by an accessor." Which made me think it
>         would do what I need, but it doesn't.
> 
> 
>     Yes, it returns the raw value, regardless of what transformations took
>     place, it reaches into the object itself. Please suggest better wording
>     for above piece of documentation (or just send a github pull req :)
> 
> 
> Well, now that I'm reading it again it seems more clear :)

Still suggestions to make it even clearer are not a bad thing :)

>         To illustrate my point, I took the code in
>         DBIx::Class::Manual::Example, and added the following accessor
>         in the result Track:
> 
>         ...
> 
> 
>         As you can see, the overloaded accessor works with the row
>         object, but is not used by get_columns.
> 
> 
>     Yes, expected and by design.
> 
> 
> 
> Fine, but I get the same result with get_inflated_results
> 
>   while (my $track = $rs->next) {
>     print $track->title . "\n";
>     my $track_href = { $track->get_inflated_columns };
>     print "inflated: " . $track_href->{title} . "\n";
>   }
> 
> ---
> 
> Leave Me Alone -> my favourite song!
> inflated: Leave Me Alone
> Smooth Criminal -> my favourite song!
> inflated: Smooth Criminal
> Dirty Diana -> my favourite song!
> inflated: Dirty Diana

I... hm... is it the addition of 'my fav song' that is missing?
Can you show me how you are appending it?

> I know you won't believe it :p It's ok, I'm actually not interested in 
> the inflated values, I'm just mentioning it for completeness, I need the 
> hash for a JSON view.

It's not impossible that this is in fact a bug, thus making sure I am
not missing a glaring error somewhere. Care to elaborate?

Cheers



More information about the DBIx-Class mailing list