ActiveRecord-importで1クエリでcolumnの値をupdateする方法

Railsでもまとめてupdateしてクエリ発行数を抑えたい!

Railsアプリケーションで、例えば人気投票やカウンター機能で1度に複数のrecordに跨ってincrement…といったケースで 1クエリで実行したい 場合。

既存のレコードのありきの場合はMySQLでは例えば

update votes set counter=counter + 1 where id IN (1, 2, 3)

と言った書き方で出来ますが、Railsだと記述の仕方によってはUPDATEする前にSELECTのクエリが入ったり1件ずつUPDATEしてしまうのでクエリの発行数が増大してしまいます。

また同時に更新処理をする際に、SELECT〜UPDATEが完了するまでの間ロックをしないと正しく値が更新されなくなりますし、ロックをすれば(特に複数レコード同士に跨ると) デッドロックの原因になる のでパフォーマンスを重視するなら1クエリで抑えたいですね!

でもActiveRecord-importの出番なしに

Vote.where(id: [1, 2, 3]).update_all('counter = counter + 1')

と書くことが出来ます。あ…ココまではタイトル関係ないです、すみません。

さらに既存のレコードが無かったら追加したい場合は?

ただ…そこで既存のrecordが 既に存在しているか分からない 前提になるとこれでは通用しなくなりますね。

ここで考えたのが… insert ... on duplicate key update のMysQL構文を持ってくること。
となれば表題の通り ActiveRecord-import Gem の出番になります。

しかしドキュメントを読んでいる限りでは、 on duplicate key update counter = counter + 1 みたく、columnの値を含めた計算式を入れる方法が見当たりません。

最後の望みを託してソースコードを確認すると…
この部分でどうやらそのまま文字列の式を入れるとSQL文に組み込んでくれるように見えます!

ということで、このように書けば1クエリで実行することが出来ました!

records = ids.map do |id|
{ id: id, counter: 1 }
end

Vote.import! records, on_duplicate_key_update: 'counter=counter + 1'

ソースコードのリンクはMySQL用ですが他にPostgresSQLやSQlite用も同様の実装に見えました。

ただし仕様に載ってないということは、将来のバージョンアップでサイレントで実装が変わってしまう可能性はあるので要注意ですね。

PayPayとLINE Payが20%還元をしまくるので色々買ってみた感想

2018年の12月にPayPayの利用で20%ポイント還元を打ち出してから、LinePayなどと競い合ってキャンペーンを出し続けている状態が続いてる。
しかし、僕のケースでは 特に前から欲しいと思っていたものが無かった‥ という重大な問題があった。

これを機に何か買い替えたいものは無いだろうか…と考え出しても、そりゃすぐには思い浮かばない。
と最初は思っていたが、調べたり家の中をくまなく見ていくうちに、あれば便利そうなものがだんだん出てきたので、順次家電などが増えていく結果となった。

家計としては大助かり…かと思いきやむしろ支出が増えてしまったわけではあるがw、長期的に見ればだんだん元が取れることを信じたい。
ここでは、そんな中でも特にいい買い物になったもの、逆にあまり効果のなかったものを記録していく。

ビックカメラで買ったもの

1.MacのUSB-TypeC用充電器(大成功)

自分の私用のPCは結構古いので電源は未だにMagSafe2を採用しているが、社用のPCを時々持ち帰って作業することがあり、また充電形式がUSB-TypeCなのでちょうどUSB-TypeC対応のMacのACアダプタがほしいと考えていた。

ACアダプタまで持ち帰りたくないワガママとはいえ、仕事のために私物を買うのかあ…(泣)と思うところは少しあるが。

また私用PCのACアダプタも一部被覆が破れていたので買い替えたいなあ…と思っていたので、出来ればついでにこの買ったUSB-TypeC用のアダプタと共用にしたいと思い、コネクタを探してみる。

探すもAmazonでは意外と逆パターンばかりで奥深くまで探索してもいまいち売ってあるのが見つからない…MagSafe2用のアダプタ+コネクタの方が良かったかなあ…と焦るも、なんとかeBayでこれを見つけた。

NEW USB C Type-C to L-Tip T-Tip 45W 60W 85W Charger Adapter for MacBook Air Pro | eBay

60W MagSafe 1(L-Tip) to USB-C Laptop Adapter for Apple MacBook Air Pro 10″ 12″ 13″ 15″ Feature: *Plastic materials provide more efficient thermal radiation. *MagSafe 1(L-Tip) replacement adapter is for Macbook Air, while MagSafe 2(T-Tip) replacement adapter is for Macbook Pro. *This adapter is made specifically for your Apple MacBook Air/ MacBook Pro to powered equipment.

ちゃんと動くかどうかドキドキではあったが、問題なく使える商品を引けた。

結果的には私用PCのACアダプタとの兼用にもなれた上に、被覆が破れてアダプタごと買い替えパターンもこれできっとなくなるので、いい機会になった。

2.圧力鍋(大成功)

この商品を購入した。

ビックカメラ.com – ≪IH対応≫ 圧力鍋 「クリプソ ミニット デュオ」(5.2L) P4605136 レッド

T-fal ティファール≪IH対応≫ 圧力鍋 「クリプソ ミニット デュオ」(5.2L) P4605136 レッドの購入ならビックカメラ公式通販サイト。価格、スペック情報、レビュー情報もあります。お店で貯めたポイントも使えます!

シチューやカレーなどの煮物で、15分〜20分煮込む工程をなんと5分にしてしまう優れものだった。

実際には具材を切ったり炒めたりをするのはもちろん、ルゥを入れてからの最後の煮込みも時短出来ないので、トータルの調理時間が2分の1や3分の1になるような劇的さではない。とはいえ他の作業をしてても煮込みで待ち時間が生じたり、すぐ食べたいから他の料理にするかあ…といったことが無くなるレベルだったので有り難い。

でもこれだけではない。さらに凄いのは、ごはんが炊飯器の早炊きより早いこと。15分くらいで出来てしまうから、ごはんを炊き忘れても安心というメリットも生まれた。

ただ…食洗機に入れるにはカツカツな大きさなのが玉に瑕。今後3〜4人家族として使うことを見越してのサイズ選択だったが、もう少し小さいのを選んでも良かったかもしれない。

3.IHクッキングヒーター(成功)

冬場はしゃぶしゃぶなどの鍋物が捗る季節だが、持ち運べるコンロが無かったゆえに食べる途中で定期的に温め直す面倒な作業が発生してしまうことになっていた…

ということで、持ち運びできるIHヒーターを買ってみた。

BEA-140B IHクッキングヒーター

火力はMAXでもさほど高く無かったので調理用には心許無いかもしれない。とはいえ保温するには十分で目論見通り食卓で鍋を楽しむのが便利に、そして心なしか頻度が高くなったw

4.スマートリモコン(まあまあ)

一通り20%還元で買って一服するもつかの間、まだまだキャンペーンが続いたのでひねり出しながら何を買おうか考えてみた…そうだ、スマートリモコンはどうだろうと思って即購入。

選んだのは Nature Remo 2nd Generation [REMO-1W2]他のと比べてIFTTT対応やさらにAPI対応など、自由度が高そうなのが決め手で選んでみた。

この商品は価格.comで見てもほぼ横並びの値段なので、ポイント還元されれば確実にお得になる感もある(?)

また廉価版のminiと比べても温度に加えて湿度/照度/人感が使えるそうなのでとりあえず高いのにしてみたが、今のところ以下の理由で使えていない。

  • 照明が全灯&消灯ボタンしか認識してくれなかった(オーデリック製NRL-322A-JPのリモコン)
  • 温度計の温度がほとんど変わらず、仕事してくれない

そもそもスイッチのオンオフには使えるが、それ以上の調整についてはボタンの問題やセンサーの問題からなかなか出来ないケースも多いようだ。

また壁越しに別の部屋のリモコンを操作することが出来ないので、それならminiの方を2台買っておけばよかったかなあ…と思うところ。

とはいえ、いまのところ以下の目的にはうまく使えているのでまあまあといったところか。

  • 朝起きる前・帰宅前にエアコンを付けてほしい
  • 節電のため、寝る1〜2時間前にエアコン止めたい
  • テレビのオンオフやチャンネル操作をしたい
  • Amazon Echoと連携して、声で操作するのが意外と便利。手がふさがってても操作できるメリットは、特に育児中は大きい。

やっぱりこれだけの目的ならわざわざ高いやつを買う必要がないので、もっと使えるようにはなりたいなあ…

5.赤ちゃんを寝かす寝室のシーリングライト(失敗)

寝室のライトがギリギリ平成生まれだったかどうかくらいの蛍光灯だったことをふと思い出して、シーリングライトを交換することにした。

LEDなら赤ちゃんを寝かしつける・寝ている際に、暗いけどお世話に必要な微妙な明るさを確保できそうかなあとも目論んで、以下の条件で選定してみた。

  • 眩しく感じないかつ明るさを確保できるようにするため、 光る面積の大きい照明であること
  • 消灯→最小光量 の操作で、うっかり明るくしないで済むリモコン設計であること

結果、以下の商品を購入することにした。

ビックカメラ.com – LEDH908YLC-BK LEDシーリングライト [8畳 /リモコン付き] 【ビックカメラグループオリジナル】

東芝 TOSHIBALEDH908YLC-BK LEDシーリングライト [8畳 /リモコン付き] 【ビックカメラグループオリジナル】の購入ならビックカメラ公式通販サイト。価格、スペック情報、レビュー情報もあります。お店で貯めたポイントも使えます!

しかし、結局のところ、以下の理由で赤ちゃんの育児用には使えなかった

  • オムツ替えなどの世話には、小物の電灯で 作業する場所に明かりを動してやるほうが便利 ということに気づいてしまった。
  • この寝かしつけの本を後によんだところ、「常夜灯は子供の睡眠にとっては明るすぎる」「ライトは足下だけをうっすら照らすものがいい」という旨が書かれていたので、なおさら小物の電灯を使って世話したほうがいいようだ。

‥ということで、普通用としておとなしく使いますw

6.獺祭(大成功)

この磨き三割九分も手が出せる気がしてくるぞ…

そういえば、ビックカメラでは家電以外のものも結構売っている。例えばお酒。

一時期は話題沸騰して、なかなか正規ルートで買えなかった獺祭も、今では実はビックカメラで買えるようになったということに気づいた。
ならば、PayPay払いで買うしか無いw

うん‥味はほのかに甘く、日本酒の中でも特に美味しかった(小並感)。

その他

御徒町の多慶屋でお菓子・加工食品爆買い

上野・御徒町のディスカウントストア | 多慶屋(たけや)の公式サイト

多慶屋(たけや)の公式サイトです。多慶屋では、食品、薬品、化粧品、健康食品、生活雑貨、家電、腕時計、アクセサリー、ブランド衣料、服飾、家具、インテリアまで良い品をお求め安い価格にて販売しております。

日持ちするお菓子や加工食品をメインに取り扱っており、そのジャンルでは都会の狭いスーパーより品揃えがいい上に安いものが多いので、個人的に御徒町に行く用事があるときは必ずと言っていいほど何か買ってから帰っている。
ただでさえそんな安いお店なのに、PayPayで20%ポイント還元と言われたら、なおさら使わない手はないw

ふるさと納税で頂いた境港市のぶりを食す

ふるさと納税の返礼品で刺身にできそうな鮮魚を探して

ふるさと納税で人気の海鮮となると、イクラやカニが多いなあ…けど美味しさは高さの割にあってない気がするし、鮮魚の刺身が食べたいなあ…と思って探してみることに。
マグロだと正直あまりお得!!なのは無いなあ…返戻率3割と考えても、お店でお得なときに買ったほうがいいかなあなんて思っていた矢先に見つけたのが…

1万円で、ボリュームは1.3〜1.5kgのぶり
境港市のぶり

量の多さでつい惹かれてしまいました!
多少捌く手間は必要になるけど、三枚おろしした後だからそこまでじゃないだろうしその分お得だし…wと思って購入。

ただこれ、産地はどうやら大分産(加工業者が境港市)らしいので、今後残れるかはちょっとグレーかもしれないですねw

届いてみると大きさと新鮮さにびっくり!

長さとしては40cmくらいでしょうか…
冷蔵庫にはなんとか収まってほっとした…と感じてしまうレベルでした

加えて、冷凍ではなく冷蔵なのに未開封で1週間保存できる、刺身でちゃんと食べられるとの表示でしたが、
実際に開けてみると 全くと言っていいほど血がしみ出ない …加工技術の凄さにびっくりしました!
たしかにこれは 加工地として 境港市が出す意味があるかもw

食べ方を考えてみる

ボリュームとしてはむっちゃありましたが、頭の部分や血合いの肉もあるので、すべてを刺身として食べられるわけでは無く…
それにとてもじゃないけど2人・1日で食せる量ではないので、残りは冷凍もしくは加熱用に回す
色々考えてみた結果、以下のように分けることにしました。

カマ…300gくらい。焼いて食す!


付属の説明書に沿って、エラから頭側を切断し、こちらはブリカマということで焼いて食してみました。
思ったよりも量が多く、脂がたっぷり乗っていて焼くにはちょっともったいないくらいではありますが、骨などが複雑に付いていて細かく切りづらいので、焼くのがセオリーと思います。
そして、シンプルに塩だけの味付けでもしっかり楽しめて満足でした。

背身の頭側…300gくらい。刺身にぴったり

ぶりの背身は刺身にピッタリみたいですね!頭側は身も白っぽく、まさしくイメージしたどおりのぶりの刺身が作れそう‥ということで早速使ってみました。

結構量が多いように見えますが、測ってみたら300gくらいで2人で1回で食せてしまいましたw丁度いいボリュームでした。

血合い、骨の近く、皮…150gくらい。あら汁にして、身をポン酢で付けると美味しい!

このレシピ を参考にあら汁を作ってみました。
味としてはほとんど味噌汁で、魚特有の臭みを感じることなく楽しめました!
また、ブリの身をポン酢に付けて食べると、ぶりしゃぶに似た食感を楽しめて満足でした。

腹身の頭側…300gくらい。ぶりしゃぶで美味しくいただく。

たっぷり刺身を食してもまだまだ余る…袋から取り出した当日中には食べ切れず、1日冷蔵保存してしまいました。
けれども血が滲み出ることもほとんどなく、鮮度に衰えをあまり感じず楽しめました…スーパーでは出会え無さそうなすごい品質!

また腹の下端のほうの身はなかなか皮と密着して取りづらいですが、他とは見た目からなんか違う…(画像の上部に持ってあるやつです)
トロみたいなので、おそらくブリトロでしょうか!

頑張って取っただけの甲斐はありましたw
脂身が多く、食感がいいのでこちらは生で食べるほうがいいかも

尾側

残った尾側のほうは、2人で一両日中には消費しきれないのでちょっともったいないと思いつつも、照り焼き用に冷凍保存しました。
身も赤っぽいので、残すのであれば尾側をのこしたほうが良さそうです。

感想

鮮度を活かした刺身・しゃぶしゃぶとしては全体の半分程度しか楽しめませんでしたが、それ以上に質の良さを楽しめて思わぬ収穫がありました!
家族3人、4人になればこちらも刺身として無理なく楽しめそうなボリューム…でしょうか。