RA Jones wrote:
So I created a very simple overloaded insert() method as described in DBIx::Class::Manual::Component, in a new module called DBIx::Class::CRUD

package DBIx::Class::CRUD;
use base qw/DBIx::Class/;

sub update {
 my $self = shift;

 my %dirty_cols = $self->get_dirty_columns;
 use Data::Dumper; # open $fh here
 print $fh Dumper %dirty_cols;
 return $self->next::method( @_ );
}

And in MyApp::Schema::MyClass:
__PACKAGE__->load_components(qw/PK::Auto CRUD Core/);

But %dirty_cols is empty. The DBIC::CRUD::insert method *is* being called as a) I can dump $self to output, where there is no entry for anything resembling get_dirty_columns, and b) entry confirmed with $c->log->info( join "\n" => Class::C3::calculateMRO('Schema::MyClass') ):

Having completely failed to find a way to make get_dirty_columns work, I implemented the following alternate method of logging updated fields:

In MyApp::Controller::Locations :-

sub do_edit : Private {
  my ( $self, $c ) = @_;
  my $fields = $form->field;
  my $old_vals = { map { $_ => $location->$_ } $location->columns };
  # do the table update, then:
  $c->controller('Root')->record_changes($c, $old_vals, $fields);

}

In Root::Controller :-

sub record_changes : Private {
  my ( $self, $c, $old, $new ) = @_;
  map {
    my $vals = {
      old_value => $old->{$_},
      new_value => $new->{$_},
      dbid      => $old->{id},
      field     => $_,
    };

    $c->model('Schema::Log')->create($vals);
  } grep $old->{$_} ne $new->{$_}, keys %{ $new };

It does everything I wanted (so far). Comments welcome.
--
Richard Jones
Leeds, UK
ra.jones(at)dpw.clara.co.uk

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to