†でおきしブログ†

ウナギ食べたいヽ(•̀ω•́ )ゝ✧

ActiveRecordクエリでwhereに条件つけたい時にyield_selfがとても便利!

 HogeModel.yield_self{|relation| fuga.present? ? relation.where(moge: "mogemoge") : relation}.where…


のようにチェーンしつつyield_selfブロック内で条件分け出来ます。条件に合致しない場合はrelationをそのまま返す事で、後続のチェーンに影響を出さない。

 @hoge = HogeModel.where(xxx)
 @hoge = @hoge.where(xxx) if fuga.present? ←yield_selfを使うとこういうif文とオブジェクト更新の処理が不要になるのです

☆参考

qiita.com

  • Ruby2.6からはyield_selfのエイリアス?"then"が使えるようになったそうです。(使えました)
  • ActiveRecordクエリ以外にも色々チェーンさせて使えるらしい。
  • このあたり調べていくと、レシーバーやらProcやらブロックやら僕は聞きなれない言葉が色々出てきました

たのしいRuby 第6版 (Informatics&IDEA)

たのしいRuby 第6版 (Informatics&IDEA)