[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