[jifty-devel] Bug in Jifty::Record::columns leading to problems in "jifty schema --setup"

Henry Baragar Henry.Baragar at instantiated.ca
Thu Jul 5 14:06:06 EDT 2007


On Thursday, July 05 2007 10:29 am, Sean E. Millichamp wrote:
> Henry Baragar wrote:
> > I have not be able to figure out why it does this, but I can tell you
> > that it does not list "customer_id" twice if the "refers_to" is removed,
> > nor if the column is named something else (such as "customer_di").
>
> There is internal Jifty magic with column names ending in "_id".  You
> can add an _id to a refers_to column to get the actual numerical ID back
> instead of the actual object.  As a result, you can't name refers_to
> columns with an ending of "_id", things get confused.
>
I thought the magic was more along the lines that if your column name ends in 
"_id", then Jifty magically creates a method with the same name as the 
column, but with out the trailing "_id", that will return the object for you.  

I have provided a sample below that tests things both ways, and I get errors 
if the refers_to column name does not end in "_id".  Given this behaviour, 
then I think there is a problem in what columns returns.  

Am I mistaken?
 

> This bit me for hours once a long time ago and, now that I'm thinking
> about it, I don't think I ever contributed a documentation patch.  Shame
> on me :(.
>
This had confused me before as well.  I am not sure I understand things well 
enough to improve the documentation.

Henry

> I don't have time to craft one at the moment, but if you do I'm sure it
> would be welcomed.
>
> Sean
>
> _______________________________________________
> jifty-devel mailing list
> jifty-devel at lists.jifty.org
> http://lists.jifty.org/cgi-bin/mailman/listinfo/jifty-devel


Account.pm
=======

use strict;
use warnings;

package Test::Model::Account;
use Jifty::DBI::Schema;

use Test::Record schema {
    column name =>
        type is 'varchar(20)',
        ;
    column customer_id =>
        type is 'integer',
        refers_to Test::Model::Customer,
        ;
};

# Your model-specific methods go here.

1;


Customer.pm
========

use strict;
use warnings;

package Test::Model::Customer;
use Jifty::DBI::Schema;

use Test::Record schema {
    column name =>
        type is 'varchar(20)',
        ;
    column account =>
        type is 'integer',
        refers_to Test::Model::Customer,
        ;
};

# Your model-specific methods go here.

1;


01-model-refers_to.t
============

#!/usr/bin/env perl
use warnings;
use strict;

=head1 DESCRIPTION

A basic test harness for the Account model.

=cut

use Jifty::Test tests => 6;

# Make sure we can load the model
use_ok('Test::Model::Account');
use_ok('Test::Model::Customer');

# Grab a system user
my $system_user = Test::CurrentUser->superuser;
ok($system_user, "Found a system user");

# Try testing a create
my $ref_a = Test::Model::Account->new(current_user => $system_user);
$ref_a->create(name => "refered to account");
my $ref_c = Test::Model::Customer->new(current_user => $system_user);
$ref_c->create(name => "refered to customer");

my $a = Test::Model::Account->new(current_user => $system_user);
$a->create(name => "account");
my $c = Test::Model::Customer->new(current_user => $system_user);
$c->create(name => "customer");

$a->set_customer_id($ref_c->id);
$c->set_account($ref_a);

is($c->account->name,"refered to account","Got refered to account name");
is($a->customer->name,"refered to customer","Got refered to customer name");
is($c->account_id,$ref_a->id,"Customer refers to the correct account id");


prove -vl t/01-model-refers_to.t
===================

t/01-model-refers_to....1..6
ok 1 - use Test::Model::Account;
ok 2 - use Test::Model::Customer;
ok 3 - Found a system user

#   Failed test 'Got refered to account name'
#   at t/01-model-refers_to.t line 35.
#          got: 'refered to customer'
#     expected: 'refered to account'
Can't locate object method "account_id" via package "Test::Model::Customer" at 
t/01-model-refers_to.t line 37.
# Looks like you planned 6 tests but only ran 5.
# Looks like you failed 1 test of 5 run.
not ok 4 - Got refered to account name
ok 5 - Got refered to customer name
dubious
        Test returned status 1 (wstat 256, 0x100)
DIED. FAILED tests 4, 6
        Failed 2/6 tests, 66.67% okay
Failed Test            Stat Wstat Total Fail  List of Failed
-------------------------------------------------------------------------------
t/01-model-refers_to.t    1   256     6    3  4 6
Failed 1/1 test scripts. 2/6 subtests failed.
Files=1, Tests=6,  1 wallclock secs ( 0.94 cusr +  0.10 csys =  1.04 CPU)
Failed 1/1 test programs. 2/6 subtests failed.


More information about the jifty-devel mailing list