【備忘録】ワシ「hogeがbarでなければbarに変えちくり^〜」RoR「は?」

ワシ「はい!ステータス変更がしたいんですが!」

クッソ久々の投稿はプログラミング関連の話題。controllerのupdateアクションで「こーゆーヤツだけupdateしてぇな〜オレもな〜」なんて時がある。ひでがきらいな人はひで以外をupdateしたくなるかもしれないし、逆もしかりで、ひでのみupdateかけたいなんてこともあるだろう。じゃあこんな時はどうしたらいいんですかねぇ…?

「『ひですき』じゃなかったら『ひですき』にして」

いわゆる洗脳ってヤツですねぇ、こりゃあ参った。こんな要件提示してくるなんて、奇特なクライアントがいたもんだ。たまげたなぁ…。ワシは別に洗脳がしたくてプログラミング始めたわけじゃないんだが…まぁでもそういう案件なんだから仕方ないね♂パパッとやって、終わり!にしよう。

【環境】

Ruby: 2.2.3
Rails: 4.2.0
gem enum_help: 0.0.16, 0.0.15

それじゃあいくよォ〜

こちら、ウェルカムmodelになります。

# == Schema Information# Table name: hoges#  id :integernot null, primary key#  status:integerdefault(0), not null#  created_at  :datetime  not null#  updated_at  :datetime  not nullclass Hoge < ActiveRecord::Base  enum status: %i(foo bar)end

2品目はデジタルcontrollerです。

class HogesController < ApplicationController#patch method  def bar @hoge = Hoge.find(params[:id]) @hoge.bar! unless @hoge.bar?  e => redirect_to fugas_path, alert 'bar error'  endend

…とこういつも通りにコース料理を提供していたのだが、ここで料理長の中野くんからお叱りを食らう。

中野くん「@hoge.bar!にunless @hoge.bar?なんて…冗談はよしてくれ…」

だそうで。いや、@hogeがbarじゃないならbarにしてっつってんの!(半ギレ)冗長なわけないだろ!いい加減にしろ!…と思ったのだが、料理人解体ショーで乾いた拍手をもらうのも嫌なので渋々条件を消してRailsが発行するSQLをよくよく見てみると…?

条件書かんでもSELECT走っとるやんけ!

これはたまげたなぁ…何も言わんでもRails先輩はbarじゃないものだけを取ってきてくれてたのか…仕事できるじゃんアゼルバイジャン。コードの記述量が減ってスッキリ、ハァ〜生き返るわぁ〜♨️これでhogeをhideに変えてstatusをlovedとhatedにすれば、クライアントの要件は満たされてギャラもらって帰れるな!(歓喜)いや^〜、よかった中野くん呼んで(ねっとり)

ケツ論を要約して差し上げろ

ステータスを変更したい時、特に「○○じゃなかったら○○にして」という場合、この「○○じゃなかったら」という部分は書かなくてもRailsが勝手にやってくれてるってこと。だからわざわざ書かんでもええんやで(ニッコリ)条件を書かなきゃいけないのは「変更前のステータスが××だったら」とか「53歳以上だったら」とか、そういう場合ってことやね。ふーん(無関心)まぁとりあえず洗脳案件のコード公開して終わり、閉廷!

# == Schema Information# Table name: hides#  id :integernot null, primary key#  status:integerdefault(0), not null#  created_at  :datetime  not null#  updated_at  :datetime  not nullclass Hide < ActiveRecord::Base  enum status: %i(liked hated)end
class HidesController < ApplicationController#patch method  def like @hide = Hide.find(params[:id]) @hide.liked!  e => redirect_to ojisans_path, alert 'やっぱり ひできらい'  endend

ノンケ向けはこっち(Qiita)

\Twitterも要チェックやで!/