diff --git a/Changes b/Changes index 1ededcf..9ecbda6 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ + Bug: unable to make fields unique when the accessor differs from column name. + 0.29 Fix tests broken because item is now cleared @@ -78,4 +80,3 @@ Fix dependency errors 0.04 Sun July 26, 2009 Split from HTML::FormHandler distribution - diff --git a/dist.ini b/dist.ini index 16f8569..ba1cad8 100644 --- a/dist.ini +++ b/dist.ini @@ -39,6 +39,7 @@ HTML::FormHandler = 0.40016 Moose = 2.0007 DBIx::Class = 0.08250 DBIx::Class::ResultSet::RecursiveUpdate = 0.25 +List::Util = 1.29 namespace::autoclean = 0.09 [Prereqs / TestRequires] diff --git a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm index 7720978..429efb8 100644 --- a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm +++ b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm @@ -7,6 +7,7 @@ use Moose::Role; use Carp; use DBIx::Class::ResultClass::HashRefInflator; use DBIx::Class::ResultSet::RecursiveUpdate; +use List::Util 'pairmap'; use Scalar::Util ('blessed'); our $VERSION = '0.26'; @@ -259,6 +260,20 @@ sub _build_ru_flags { { unknown_params_ok => 1 }; } +has _accessor_aliases => ( + is => 'ro', + isa => 'HashRef', + lazy_build => 1, +); + +sub _build__accessor_aliases { + my $self = shift; + return { + pairmap { $b->{accessor} || $a => $a, $a => $a } + %{ $self->resultset->result_source->columns_info } + }; +} + sub validate_model { my ($self) = @_; return unless $self->validate_unique; @@ -468,8 +483,9 @@ sub validate_unique { my $value = $field->value; next unless defined $value; my $accessor = $field->accessor; + my $column = $self->_accessor_aliases->{$accessor} || $accessor; - my $count = $rs->search( { $accessor => $value, @id_clause } )->count; + my $count = $rs->search( { $column => $value, @id_clause } )->count; next if $count < 1; my $field_error = $field->get_message('unique') || $field->unique_message || 'Duplicate value for [_1]'; $field->add_error( $field_error, $field->loc_label ); diff --git a/t/db/bookdb.sql b/t/db/bookdb.sql index 5677903..0be26c5 100644 --- a/t/db/bookdb.sql +++ b/t/db/bookdb.sql @@ -1,7 +1,7 @@ BEGIN TRANSACTION; CREATE TABLE user ( user_id INTEGER PRIMARY KEY, - user_name VARCHAR(32), + un VARCHAR(32), fav_cat VARCHAR(32), fav_book VARCHAR(32), occupation VARCHAR(32), diff --git a/t/lib/BookDB/Form/User.pm b/t/lib/BookDB/Form/User.pm index 2271bfd..17781f2 100644 --- a/t/lib/BookDB/Form/User.pm +++ b/t/lib/BookDB/Form/User.pm @@ -6,7 +6,7 @@ use DateTime; has '+item_class' => ( default => 'User'); -has_field 'user_name'; +has_field 'user_name' => ( unique => 1 ); has_field 'fav_cat' => ( label => 'Category' ); has_field 'fav_book' => ( label => 'Favorite Book' ); has_field 'occupation'; diff --git a/t/lib/BookDB/Schema/Result/User.pm b/t/lib/BookDB/Schema/Result/User.pm index fbd2edd..e07698e 100644 --- a/t/lib/BookDB/Schema/Result/User.pm +++ b/t/lib/BookDB/Schema/Result/User.pm @@ -10,8 +10,8 @@ __PACKAGE__->table("user"); __PACKAGE__->add_columns( "user_id", { data_type => "INTEGER", is_nullable => 0, size => 8 }, - "user_name", - { data_type => "VARCHAR", is_nullable => 0, size => 32 }, + "un", + { accessor => "user_name", data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_cat", { data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_book",