5

DBIx :: Class ResultSourceでnew()メソッドを使用して(一時的な可能性のある)変数を作成する場合、DBICスキーマで指定されたデフォルト値(そこからテーブルを作成するために指定した)が属性に入力されていないようです。スキーマ)。

現在、このようなクラスの1つ(これが問題となった最初のケ​​ース)に対して1つのデフォルト値を作成しています。

sub new {
  my $class = shift;
  my $self = $class->next::method(@_);
  $self->queue('DEFAULT_QUEUE_VAL') unless $self->queue();
  return $self;
}

そのクラス(つまり、属性queue => DEFAULT_QUEUE_VAL)。ただし、長期的には、さまざまなデフォルト値を持ついくつかのDBICクラスがあり、さまざまな場合すべてに上記のロジックを複製することは避けたいと考えています。

これを行うために利用できるCPANモジュール/プラグインはありますか?CPANの(明らかに大雑把な)検索では何も見つかりませんでした。

編集:コードサンプルのゴミを修正しました。古いコードからcpしたことがわかりました。

4

3 に答える 3

2

このためのDBICコンポーネントはないようですが、既存のコードに小さなmodを追加することで実行できます。

sub new {
  my $class = shift;
  my $self = $class->next::method(@_);
  foreach my $col ($self->result_source->columns) {
    my $default = $self->result_source->column_info($col)->{default_value};
    $self->$col($default) if($default && !defined $self->$col());
  return $self;
}

これは単純明快なので、コンポーネントにはあまり意味がありません。

于 2010-01-26T07:17:33.803 に答える
0

あなたのコードは、オブジェクトメソッドではなくクラスメソッドとしてqueue()を呼び出していませんか?もしかして

$new->queue('DEFAULT_QUEUE_VAL') unless $new->queue();

編集-申し訳ありませんが、質問を読み直して、それは単なるタイプミスだと思います

考え-デフォルト値がSQLスキーマにある場合、それをオブジェクトにも設定する必要がありますか?NULL(undef)を渡すと、テーブルのデフォルト値が取得され、それをオブジェクトに反映するために、サブクラス化されたnew()メソッドを設定してdb行を再読み取りします(-> discard_changes()はそれを行いますi考える?)

于 2010-01-21T10:51:09.567 に答える
0

もう1つの方法は、データベースに「保存済み」フィールドを作成し、保存時にマークを付けることです。ビューを使用して、保存されたオブジェクトと新しいオブジェクトを区別できます。

このアプローチは遅くなりますが、上記の回答で問題が発生する可能性のあるDATETIMEまたはその他のDB固有のデフォルトを選択できます。

于 2010-07-23T07:35:38.050 に答える