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 ではなく例外が発生するかどうか、ちょっとあやふやなのでこれも調査しておきます。