TL;DR
このように書けば、Animated GIFを変換できます。
image.variant(
loader: { page: nil }, # GIFアニメーションの全フレームを変換する
scale: '50%', # 1/2の大きさにする
coalesce: true, # アニメーションシーケンスの最適化
deconstruct: true, # アニメーションシーケンスの最適化2
dither: true, '+': true, # エイリアシングを無効化して処理を早くする
layers: 'Optimize', # GIFアニメーションを最適化
)
コツ
重要なのはloader: { page: nil }というオプションで、variantはデフォルトでは最初の1フレームしか変換を掛けてくれません。なので、pageの指定を無くすことで全フレームに対して変換を掛けます。
coalesceオプションとdeconstructオプションについては、下記のサイトが詳しいと思います。
https://unoh.github.io/2008/12/11/imagemagickgif.html
あとは+ditherというオプションの書き方です。dither: trueと書くと、-ditherというオプションになってしまいます。
今回は+ditherで実行したいので、そういう場合は一度dither: trueと宣言した直後に'+': trueと書くことで、+ditherというオプションにしてくれます。
...combine_options(Rails6から非推奨)で使っていた手法をそのまま持ってきたのですが、このやり方のドキュメントが見つからず苦労しました。正直ここの理屈も分かっていません。分かる方がいらっしゃったら、編集リクエストを送って頂くか、コメントにてご教授頂けると幸いです。