[Dbix-class] Trouble updating columns (possible bug or not enough DWIM)

John Napiorkowski jjn1056 at yahoo.com
Thu May 10 21:09:16 GMT 2007


--- Matt S Trout <dbix-class at trout.me.uk> wrote:

> On Thu, May 10, 2007 at 11:10:49AM -0700, John
> Napiorkowski wrote:
> > Hi,
> > 
> > I may have an issue with the way Row.pm's
> set_column
> > method performs it's comparison with possible old
> > values for the purposes of marking a column dirty.
> > 
> > I'm running a filter using DBIx::Class::Validation
> to
> > try and guess a reasonable datetime object out of
> > whatever the user submits to a form.  I noticed
> that
> > when you update a column $Row->set_column does a
> > comparison to any old values for the purposes of
> > marking something dirty.
> > 
> > However if the old value is a string and the new
> one
> > is a DateTime object I get the following error:
> > 
> > "A DateTime object can only be compared to another
> > DateTime object (DateTime=HASH(0xab3854c),
> tomorrow)."
> 
> That should never happen - a column that's inflated
> to a datetime will
> have an accessor that calls set_inflated_column, not
> set_column - which will
> deflate the value, thus resulting in the comparison
> being made between two
> strings.
> 
> This is why you should almost always use the
> accessor methods rather than
> calling set_column directly - it's a public method
> primarily for subclassing
> purposes, not for you to call because you've
> forgotten $obj->$col($val)
> works.

The code I have dies on ->create_related(...) because
the DBIx::Class::Validation profile I have defines a
filter that converts plaintext to a datetime object
(or tries very hard).  DBIC::Validation automatically
updates the row if you set that behavior, and it's
calling set_column.

I did a quick hack to DBIC::Validation to change:

$self->set_column($_, $result->valid($_))
  for ($result->valid);

To:

$self->$_($result->valid($_)) for ($result->valid);

And behold!  That solved the problem!  Thanks Matt. 
I'll offer a patch to the maintainer of
DBIC::Validation.

--John



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



More information about the Dbix-class mailing list