DBIx :: Class find_or_create error - Невозможно получить данные как метод класса в - PullRequest
1 голос
/ 29 декабря 2011

У меня есть следующая схема:

package Food::Schema::Result::Order;

# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE

use strict;
use warnings;

use base 'DBIx::Class::Core';


=head1 NAME

Food::Schema::Result::Order

=cut

__PACKAGE__->table("orders");

=head1 ACCESSORS

=head2 id

  data_type: 'integer'
  is_auto_increment: 1
  is_nullable: 0

=head2 company_id

  data_type: 'integer'
  is_nullable: 1

=head2 user_id

  data_type: 'integer'
  is_nullable: 1

=head2 total

  data_type: 'float'
  is_nullable: 1

=head2 money_id

  data_type: 'integer'
  is_nullable: 1

=head2 created_at

  data_type: 'datetime'
  datetime_undef_if_invalid: 1
  is_nullable: 1

=head2 updated_at

  data_type: 'bigint'
  is_nullable: 1

=head2 status

  data_type: 'varchar'
  is_nullable: 1
  size: 10

=cut

__PACKAGE__->add_columns(
  "id",
  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
  "company_id",
  { data_type => "integer", is_nullable => 1 },
  "user_id",
  { data_type => "integer", is_nullable => 1 },
  "total",
  { data_type => "float", is_nullable => 1 },
  "money_id",
  { data_type => "integer", is_nullable => 1 },
  "created_at",
  {
    data_type => "datetime",
    datetime_undef_if_invalid => 1,
    is_nullable => 1,
  },
  "updated_at",
  { data_type => "bigint", is_nullable => 1 },
  "status",
  { data_type => "varchar", is_nullable => 1, size => 10 },
);
__PACKAGE__->set_primary_key("id");


# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-12-29 12:31:26
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:TZMuN6qiqXlDLR361KLqWg
use DateTime;
__PACKAGE__->remove_column('created_at');
__PACKAGE__->add_columns(
  "created_at",
  {
    data_type => "datetime",
    datetime_undef_if_invalid => 1,
    is_nullable => 0,
    accessor => '_created_at',
  },
);



__PACKAGE__->belongs_to(company => 'Food::Schema::Result::Company', 'company_id');
__PACKAGE__->belongs_to(user => 'Food::Schema::Result::User', 'user_id');
__PACKAGE__->has_many(order_lines => 'Food::Schema::Result::OrderLine', 'order_id');
__PACKAGE__->many_to_many(foods => 'order_lines', 'food');
__PACKAGE__->many_to_many(menus => 'order_lines', 'menu');

sub created_at{
 my ($self, $value) = @_;

 $self->_created_at( $self->_created_at() || DateTime::Format::MySQL->format_datetime( DateTime->now() ) ); 

 return $self->_created_at();
};

sub new{
 my ($self, $attrs) = @_;

 $self->created_at();

 my $new = $self->next::method($attrs);
 return $new;
}

1;

Я пытаюсь find_or_create сделать заказ на основе некоторых атрибутов, например:

   my $order = $self->app->model->resultset('Order')->find_or_create({
                company_id => $self->param('company_id'),
                status     => 'open',
                user_id    => $self->app->sessions->{user}->id(),
   });

И я получаю ошибку DBIx::Class::Row::get_column(): Can't fetch data as class method

Теперь, если я исключу столбец status из find_or_create, он будет работать как положено (но не так, как нужно - поэтому я хочу добавить больше столбцов в предложении).

Если я добавлю любой другой столбец в find_or_create, я получу эту ошибку.

Кто-нибудь знает, является ли это ошибкой или ожидаемым поведением, и как я могу find_or_create сделать заказ на основе большего количества значений столбца?

Edit:

Похоже, что это не ошибка - я неправильно переопределил метод new.

Метод new должен иметь вид:

sub new{
 my ($self, $attrs) = @_;

 $attrs->{created_at} = DateTime::Format::MySQL->format_datetime( DateTime->now() );

 my $new = $self->next::method($attrs);

 return $new;
}

После нескольких часов отладки мне удалось это исправить.

Спасибо всем вам, кто уделил время чтению и попытался выяснить, почему это не сработало.

...