[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