[Catalyst] DBIC register_source causing wierd Cat error?

Caroline Johnston johnston at biochem.ucl.ac.uk
Wed Jul 2 13:04:55 BST 2008


Hi,

I'm getting a wierd error and I can't quite figure out why. It's possibly
a DBIC problem, but it's giving me a Catalyst error.

Database has factor and experiment tables which have a many to many
relationship via the factor_experiment table.

DBIC many-to-many relationships are defined for both factor and experiment
classes (see below for code) and this works (as does the many-to-many):

   $c->user->experiment->factor_experiments->next->factor;

I've added a new result_source to the factor class to return only the
factors which are accessible to a given user (code below) which works
great, like:

  my @factors = $c->model('ROMEDB::FactorByUser')->search({},
                     {bind=>[$c->user->username, $c->user_username]});

But now, when I do:

    $c->user->experiment->factor_experiments->next->factor;

I get the error:

    Caught exception in ROME::Controller::Metadata->index "Can't call
method "state" without a package or object reference at
/usr/local/share/perl/5.8.8/Catalyst.pm line 1219."

This still works fine though:

  $c->user->experiment->factor_experiments->next->experiment

All I have to do to make the error go away is to comment out the
following line in the DBIC Factor class:

   ROMEDB->register_source( 'ROMEDB::FactorByUser' => $new_source );

Any idea why this happens? Am I doing something daft? Is there a better
way to do what I'm trying to do than the new resultsource?

Cheers,
Cass.




-----

package ROMEDB::FactorExperiment;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('factor_experiment');
__PACKAGE__->add_columns(qw/factor_name factor_owner experiment_name
experiment_owner/);
__PACKAGE__->set_primary_key(qw/factor_name factor_owner experiment_name
experiment_owner/);


__PACKAGE__->belongs_to(experiment => 'ROMEDB::Experiment',{'foreign.name'
=> 'self.experiment_name',
                                                           
'foreign.owner'=> 'self.experiment_owner'});   
__PACKAGE__->belongs_to(factor => 'ROMEDB::Factor',{'foreign.name' =>
'self.factor_name',
                                                    'foreign.owner'=>
'self.factor_owner'});   
1;



package ROMEDB::Factor;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('factor');
__PACKAGE__->add_columns(qw/name owner description status/);
__PACKAGE__->set_primary_key(qw/name owner/);


__PACKAGE__->belongs_to(owner => 'ROMEDB::Person', 'owner');

__PACKAGE__->has_many(factor_experiments =>'ROMEDB::FactorExperiment',
                      {
                          'foreign.factor_name' => 'self.name',
                          'foreign.factor_owner'=> 'self.owner'
                      });

__PACKAGE__->many_to_many(experiments=>'factor_experiments',
'experiment');


my $source = __PACKAGE__->result_source_instance();
my $new_source = $source->new( $source );
$new_source->source_name( 'ROMEDB::FactorByUser' );

$new_source->name( \<<SQL );
(
 SELECT DISTINCT factor.*
 FROM factor, factor_workgroup, person_workgroup
 WHERE factor.status='public'
 OR factor.owner=?
 OR (factor.status='shared'
     AND factor.name=factor_workgroup.factor_name
     AND factor_workgroup.workgroup_name = person_workgroup.workgroup
     AND person_workgroup.person=?))
                      
SQL

ROMEDB->register_source( 'ROMEDB::FactorByUser' => $new_source );




1;


package ROMEDB::Experiment;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('experiment');
__PACKAGE__->add_columns(qw/name owner date_created pubmed_id description
status/);
__PACKAGE__->set_primary_key(qw/name owner/);

__PACKAGE__->belongs_to(owner => 'ROMEDB::Person', 'owner');


__PACKAGE__->has_many(factor_experiments =>'ROMEDB::FactorExperiment',
                      {
                          'foreign.experiment_name' => 'self.name',
                          'foreign.experiment_owner'=> 'self.owner'
                      });

__PACKAGE__->many_to_many(factors=>'factor_experiments', 'factor');


1;






More information about the Catalyst mailing list