Предотвращение DBIx :: Class от вызова всего, что связано с новой, еще не вставленной строкой? - PullRequest
2 голосов
/ 12 ноября 2009

У меня есть родительские / дочерние отношения в моей схеме. Я хотел бы использовать очень похожий код для изменения существующего родителя, чтобы создать нового. В случае редактирования легко найти детей:

my $parent = $resultset->find($parent_id);
my @children = $parent->children->all

Однако в новом случае происходит нечто странное:

my $parent = $resultset->new_result({});
my @children = $parent->children->all;

Я ожидал, что @children будет пустым, но вместо этого я вернул всех детей, независимо от родителя.

Я могу сделать что-то подобное (для каждого средства доступа к связанной записи, рвота ):

sub children {
    my $self = shift;

    my $res = $self->next::method(@_);
    my $parent_no = $self->get_column('parent_no');
    defined $parent_no ? $res : $res->search({1 => 2});

}

Пожалуйста, скажите мне правильный способ сделать это, поскольку выше не должно быть.

версия: 0.08010, потому что это то, что есть в Debian Lenny (и на чем работают наши рабочие серверы)

1 Ответ

1 голос
/ 12 ноября 2009

Какую версию DBIx :: Class вы используете? Я использую самую последнюю версию 0.08112 и не могу найти метод new_record для ResultSet. Однако существует метод new_result , который выглядит так, как будто он будет иметь тот же эффект, что и метод new_record, который вы используете. Я попробовал следующий код и получил пустой массив, как и ожидалось:

my $parent = $resultset->new_result({});
my @children = $parent->children();

Кроме того, согласно документации для отношения has_many, созданный метод доступа будет возвращать объекты в контексте списка, поэтому вам не нужно вызывать все. Я попробовал это так, как у вас, хотя @children все еще был пуст.

...