LoginSignup
2
0

More than 3 years have passed since last update.

acts_as_votable の upvote_by / downvote_by はエラーハンドリングすべきか?

Last updated at Posted at 2019-05-15

acts_as_votable のモデルに対し upvote_by / downvote_by などを呼び出す際、その戻り値 (boolean) に対しエラーハンドリング処理をすべきかどうか気になったので調査してみました。

TL; NR

エラーハンドリングしなくても問題なさそう。(自信ない)

調査・考察

https://github.com/ryanto/acts_as_votable/blob/master/lib/acts_as_votable/votable.rb
Line: 96 - 103

      ActiveRecord::Base.transaction do
        self.vote_registered = false
        return false unless vote.save

        self.vote_registered = true if last_update != vote.updated_at
        update_cached_votes(options[:vote_scope])
        return true
      end

vote.save が false を返すと commit されて return false されるのではないか?

return false だろうと commit される。
ただし、後続の処理は実行されない。

そもそも false になるのか?

vote は ActsAsVotable:Vote クラスで、Gem が管理しているモデル。(votable <=> voter 間の関連テーブル)
validate は votable_id / voter_id の必須チェックのみで、コールバック処理もないため、return false は想定しにくい。(でも NOT NULL 制約ないんだよなぁ)

update_cached_votes は必ず成功するのか?

内部で Gem 用のキャッシュカラムに対し update_attributes (default) / update_columns が実行される。
! はないので true / false が戻る。
Gem 用のキャッシュカラムのみ更新されるため、validation やコールバック処理によって false になることは想定しにくい。
よって、常に true になる前提ではないかと思われる。(そうでないのは使い方がおかしいというスタンス?)

結論・・・?

2つのDB更新処理はシステムエラーをのぞいて必ず true になる。(false になる状況が想定できない、していない)
よって、upvote_by / downvote_by の戻り値によりエラーハンドリングする必要はない、と思う。

save / update_attributes でシステムエラー(DB接続エラーやタイムアウトエラーなど)が発生した場合に、return false ではなく例外が発生するかどうか、ちょっとあやふやなのでこれも調査しておきます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0