1

クライアントアプリケーションには、多対多の関係を使用して他の多くのモデルにリンクできるDBIx::Classモデル「Todo」があります。私は、ビジネスロジックのために、1つだけの外部モデルがそれにリンクされていることを知っています。次を使用して、クエリでそのモデルをフェッチしたいと思います。

my $objects = $c->model('DB')->resultset('Todo')->search($myFilter,{
    prefetch => \@relations # contains all possible relations
});

ドキュメントの状態のように、DBIx :: Class ::ResultSourceはこれについて警告します:

DBIx::Class::ResultSet::next(): Prefetching multiple has_many rels accountbalances_todos and accounts_todos at top level will explode the number of row objects retrievable via ->next or ->all. Use at your own risk. at /media/psf/projects/.../Controller/Todo.pm line 117

DBIx :: Class :: ResultSource自体を編集せずに、このエラーを防ぐ方法を教えてもらえますか?私がやりたいことをする他の方法が見当たらず、アプリケーションがログに多くの警告をダンプするのを防ぎたいと思っています。@CARP_NOTと$Carp:: Internalをいじってみましたが、Carpがこの警告をスキップするのを取得できません(これに関するドキュメントはせいぜいまばらです)

誰かが私を助けることができればそれは素晴らしいでしょう、ありがとう

4

2 に答える 2

2

警告シグナルのデフォルトの処理をオーバーライドして、この特定の警告をキャッチして無視することができます。

$SIG{__WARN__} = sub {
  my $warn_msg = $_[0];
  if ( $warn_msg =~ m/Prefetching multiple has_many rels accountbalances_todos/ ) {
    # do nothing
  } else {
    warn $warn_msg;
  }
};

または、必要に応じて、

$SIG{__WARN__} = sub {
  warn $_[0] unless $_[0] =~ m/Prefetching multiple has_many rels accountbalances_todos/
};
于 2012-06-24T12:14:59.610 に答える
1

DBIx::Classからではなくモジュールからcarp()の関数を使用します。だから、働いていません。代わりに使用してください。DBIx::Class::CarpCarp@CARP_NOT$Carp::Internal$SIG{__WARN__}

于 2012-06-24T13:34:30.930 に答える