最近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にアクセスいくようなときは、このような形で使うと便利かもしれません。