maco's life

主にエンジニアリングと読書について書いていきます。

RowをInsertしようとしてすでにRowがあったら取ってくるメソッドの扱い

最近single_or_createというメソッドをつかっていて、つらくなったのでメモ。

まずsingle_or_createとがどういうコードかというと、

sub single_or_create {
    my $self = shift;

    my $row = eval {
        #…insertの処理を走らせる
    };
    if (my $e = $@) {
       # ..depulicatedしていたらsingleでinsertしようとしてたらデータを取ってくる
       $row = ..
    }

    return $row;
}

こんな感じのコードになっています。 row無い時はinsertして、ある時はsingleで取ってくるのめっちゃ便利だなーとおもっていたのですが、これevalの中で行っているinsert処理は必ず毎回はしるので、アクセスが増えた時につらくなります。 なぜかdepulicatedな時は、insert走らないだろとおもっていたのですが、そんなことはなかったですね(╹◡╹)

なので書くとしたら

sub single_or_create {
    my $self = shift;

    my $row = … #…ここでrowを取ってくる
    return $row if $row;

    my $row = eval {
        #…insertの処理を走らせる
    };
    if (my $e = $@) {
       # …depulicatedしていたらsingleでinsertしようとしてたらデータを取ってくる
       $row = ..
    }

    return $row;
}

みたいな感じにして最初にrowを取ってくる処理を挟んで、本当に無い場合に、最初の処理を走らせればいいとおもいます。複数のユーザから1つのrowにアクセスいくようなときは、このような形で使うと便利かもしれません。