Adam Herzog wrote:
> I think I stumbled across a regression while testing RC3. I'm not sure
> how best to incorporate a test into the suite, but I've put together a
> minimal case that demonstrates the problem. It works correctly (or at
> least, as I expect it to) under 0.07006, but not the latest RC.
> 
> The test scenario contains authors and books, where a book belongs_to an
> author, and an author has_many books. The problem seems to occur where
> the foreign key in books has an accessor set, and the relationship has
> the same name as the actual column name. Somewhere along the line, the
> column accessor is getting confused with the relationship, I guess.
> 
> I've included the test files inline below, as well as attached them to
> the email.
> 
> -A

Changeset 3358: "%colinfo accessors and inflate_column now work together"

I did this one myself. Basically, inflated columns weren't getting set
to their accessors [instead of colname].

Since relationships are really inflators, I'd say this is the source of
the change. I could be wrong.


Normally, ->author() would return the author field id value. But since
you've asked it to return an author object via belongs_tom ->author()
would return the author object.

Then, you told DBIC to change the accessor from author() to author_id().
So, author_id() returns the same object that ->author() would have
because of the belongs_to.

Let's forget about the accessor option for a moment. Once belongs_to is
in place, you would always get an author object, never the field value
itself.

Seems like the correct behavior to me.

-=Chris

> 
> ============================
> MyDB.pm
> ============================
> 
> package MyDB;
> use strict;
> use warnings;
> 
> use base qw/DBIx::Class::Schema/;
> 
> __PACKAGE__->load_classes(qw/Author Book/);
> 
> 1;
> 
> ============================
> MyDB/Author.pm
> ============================
> 
> package MyDB::Author;
> use warnings;
> use strict;
> 
> use base qw/DBIx::Class/;
> 
> __PACKAGE__->load_components(qw/ Core /);
> 
> __PACKAGE__->table('authors');
> 
> __PACKAGE__->add_columns(
>     id => {
>         data_type         => 'INTEGER',
>         is_nullable       => 0,
>         is_auto_increment => 1,
>     },
>     name => {
>         data_type   => 'VARCHAR',
>         size        => 150,
>         is_nullable => 0,
>     },
> );
> 
> __PACKAGE__->set_primary_key('id');
> 
> __PACKAGE__->has_many( 'books' => 'MyDB::Book', 'author' );
> 
> 1;
> 
> ============================
> MyDB/Book.pm
> ============================
> 
> package MyDB::Book;
> use warnings;
> use strict;
> 
> use base qw/DBIx::Class/;
> 
> __PACKAGE__->load_components(qw/ Core /);
> 
> __PACKAGE__->table('books');
> 
> __PACKAGE__->add_columns(
>     id => {
>         data_type         => 'INTEGER',
>         is_nullable       => 0,
>         is_auto_increment => 1,
>     },
>     title => {
>         data_type   => 'VARCHAR',
>         size        => 150,
>         is_nullable => 0,
>     },
>     author => {
>         accessor       => 'author_id',
>         data_type      => 'INTEGER',
>         is_nullable    => 0,
>         is_foreign_key => 1,
>     },
> );
> 
> __PACKAGE__->set_primary_key('id');
> 
> __PACKAGE__->belongs_to( 'author' => 'MyDB::Author', 'author' );
> 
> 1;
> 
> ============================
> test.t
> ============================
> 
> use strict;
> use warnings;
> use Test::More tests => 3;
> 
> use MyDB;
> my $schema = MyDB->connect( 'dbi:mysql:test', '', '' );
> 
> $schema->deploy( { add_drop_table => 1 } );
> $schema->populate( 'Author', [ [qw/id name/], [ 1, 'Stephen King' ], ] );
> $schema->populate( 'Book', [ [qw/id title author/], [ 1, 'Misery', 1 ],
> ] );
> 
> my $book = $schema->resultset('Book')->find(1);
> 
> is( $book->title(),        'Misery' );
> is( $book->author_id(),    1 );
> is( $book->author->name(), 'Stephen King' );
> 
> ============================
> test output (under RC3)
> ============================
> test....ok 1/3
> #   Failed test at test.t line 15.
> #          got: 'MyDB::Author=HASH(0x1a9bbbc)'
> #     expected: '1'
> Can't locate object method "author" via package "MyDB::Book" at test.t
> line 16.
> test....NOK 2/3# Looks like you planned 3 tests but only ran 2.
> # Looks like you failed 1 test of 2 run.
> # Looks like your test died just after 2.
> test....dubious
>         Test returned status 255 (wstat 65280, 0xff00)
> DIED. FAILED tests 2-3
>         Failed 2/3 tests, 33.33% okay
> Failed Test Stat Wstat Total Fail  List of Failed
> -------------------------------------------------------------------------------
> 
> test.t       255 65280     3    3  2-3
> Failed 1/1 test scripts. 2/3 subtests failed.
> Files=1, Tests=3,  0 wallclock secs ( 0.33 cusr +  0.06 csys =  0.39 CPU)
> Failed 1/1 test programs. 2/3 subtests failed.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
> Wiki: http://dbix-class.shadowcatsystems.co.uk/
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
> Searchable Archive: http://www.mail-archive.com/[email protected]/


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to