DBIC register_source causing wierd Cat error?

View: New views
5 Messages — Rating Filter:   Alert me  

DBIC register_source causing wierd Cat error?

by Caroline Johnston :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: DBIC register_source causing wierd Cat error?

by Caroline Johnston :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

OK, so I think I've worked out the cause:
in the class_mappings:
                                       
'ROME::Model::ROMEDB::FactorExperiment' => 'FactorExperiment',
'ROME::Model::ROMEDB::Factor' => 'Factor',
'ROME::Model::ROMEDB::FactorByUser' => 'FactorByUser',

BUT

'ROMEDB::Factor' => 'FactorByUser',

If I do:

$c->model->result_source->schema->class_mappings->{'ROMEDB::Factor'} =
'Factor';
$c->model->result_source->schema->class_mappings->{'ROMEDB::FactorByUser'}
= 'FactorByUser';

Then everything works as expected. Is there a non-hacky way to tell
Catalyst to set up the class_mappings like this?

thanks!

Cxx


_______________________________________________
List: Catalyst@...
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@.../
Dev site: http://dev.catalyst.perl.org/

Re: DBIC register_source causing wierd Cat error?

by Caroline Johnston :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Wed, 2 Jul 2008, Caroline Johnston wrote:

> OK, so I think I've worked out the cause:
> in the class_mappings:
>                                        
> 'ROME::Model::ROMEDB::FactorExperiment' => 'FactorExperiment',
> 'ROME::Model::ROMEDB::Factor' => 'Factor',
> 'ROME::Model::ROMEDB::FactorByUser' => 'FactorByUser',
>
> BUT
>
> 'ROMEDB::Factor' => 'FactorByUser',

oops, that means it's a DBIC problem not a Catalyst one, eh? Apologies,
will go pester them instead...

Cheers,
Cass


_______________________________________________
List: Catalyst@...
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@.../
Dev site: http://dev.catalyst.perl.org/

Re: DBIC register_source causing wierd Cat error?

by Tobias Kremer-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Wed, 2 Jul 2008, Caroline Johnston wrote:
> OK, so I think I've worked out the cause:
> in the class_mappings:

This is probably related to something that bit me a while ago:

http://www.mail-archive.com/dbix-class@.../msg03468.html

Could be something different though. I dunno if this was ever taken care of.
The workaround mst suggested did the job for me :)

--Tobias

_______________________________________________
List: Catalyst@...
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@.../
Dev site: http://dev.catalyst.perl.org/

Re: DBIC register_source causing wierd Cat error?

by Caroline Johnston :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Wed, 2 Jul 2008, Tobias Kremer wrote:

> This is probably related to something that bit me a while ago:
>
> http://www.mail-archive.com/dbix-class@.../msg03468.html

Yup, workaround seems to work for me too. Thanks a lot!

Cxx


_______________________________________________
List: Catalyst@...
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@.../
Dev site: http://dev.catalyst.perl.org/
LightInTheBox - Buy quality products at wholesale price