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; _______________________________________________ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/