見習いの見習いプログラマ

まだまだ先は長い

ActiveRecord 3 でINSERT SELECTするためのgem activerecord-pickin を作ってみたよ

https://github.com/miio/activerecord-pickin

作りました。

経緯としては

  • INSERT SELECTって地味に使いたい時がある
  • ググっても見つからない
  • ar-extensionsっていうのは見つかったけど、Rails2
  • @onkさんに聞いてみても知らないとお返事をもらう

→じゃ、作るかーってことで基本実装だいたい1〜2日くらいだった気がします

コンセプトとしては、SELECTした結果をINSERTしたいということで、Rails3から強化されてるRelationを有効活用してみました。

使い方とか

Map.where(stage_id: 1).pickin(GameMap, {game_stage_id: 24}, [:id])

INSERT INTO 'game_maps' ("id", "game_stage_id", "type", "x", "y", "created_at", "updated_at") SELECT NULL, '24', "type", "x", "y", "created_at", "updated_at" FROM "maps" WHERE "maps"."stage_id" = 1

1つ1つ解いていきますと

SELECTしたいModel.relationのオブジェクト.pickin(Intoしたいクラス, {特定のカラムを固定の文字にしたい場合}, [INSERT対象から外したいカラム])

です。

例えば、idカラムなんかはプライマリキー制約があったりするので外したいってことが割とあると思うんですよね。 しかし、わざわざカラム指定するのも面倒そうなので対象から外すというアプローチをとってみました(もし標準機能であるなら突っ込んでほしいです

次に、値のオーバライドも対応しました。先ほどの例だと、game_stage_idはMapに持っていないから、固定値いれたいよ!って時に使います。

Map.where(stage_id: 1).select([:type]).pickin(GameMap)

INSERT INTO 'game_maps' ("type") SELECT "type" FROM "maps"  WHERE "maps"."stage_id" = 1

selectにも対応しました。この場合は、selectで指定したカラムのみに対してうまいことクエリを作ります

ちなみに、現時点ではv0.9.1になっていて、正式版ではないです(気になる仕様やテスト整備が追いついていないため 更に言うと、v0.9.0まではMySQLでシンタックスエラーになるバグを抱えています。

多分テスト整備したらv1.0.0で正式版にしたいなーと思ってたり。

開発裏話

やっていることとしては、Rails3から追加されたArelを使ってクエリ生成しているだけだったりします。Arel単体にもINSERT SELECTのクエリを発行できるとか出来ないとかありますが、あちこちFIXMEだらけだった記憶があります。

まぁ、Arelに一応存在していると知る以前に実装してしまったので、実際にはINSERTクエリとSELECTクエリを2つに分けて、これを単純に文字列連結しただけという簡単実装です。

枠を恋人にした設定で実感したこと

どうも、元カノです。

枠 Advent Calendar 2012 3日目です。

http://atnd.org/events/34329

きゅぶんずさんに会ったのは7月の頭くらいにあった、 プロ生の時ですね(会場は某M$の北海道支社でCLR/Hと札幌C++と合同のやつ)

その時は、ちょっと臆病な所があって、抱き着き魔なのは割りとすぐ分かったのですけども(@yuu_haraに抱きついてるとこを見ながら

私に抱きつくまで割りと時間がかかりました

というか、リアル女子にはかなりのチキンのようで、すっげービクビクしてましたよ(実話

というわけで、実は1週間後からスピード交際が始まり

こんなこんなで暴露されたけど、暴露ツイートどっか消えたようです

favのためなら何でもするようです。

8月に一度東京でデートしました。

尚、この数カ月後、色々あってリア充爆発しました。

札幌RubyKaigi2012 スタッフしてました #sprk2012

札幌で3日間という大規模なRubyKaigiがありました

http://sapporo.rubykaigi.org/2012/ja/

今回(も)北海道のイベントスタッフとしてレポート書いてました(注: RubyKaigiのレポートは初)

ちなみに、2011年のOSC北海道でレポートを書いていた経緯から今回のレポート業にアサインされた流れです。

良かったこと

  • スタッフTシャツは魔法の効果がある(マジ)

  • 1つのセッションに対して深く知ることが出来た

  • 某技評さんに私の名前が><

ちょっと辛かったこと

  • スタッフ業大変すぎた

  • せっかく遠方から友達きてたので、もっと構ってあげるべきだった気がする

なんてわがままを書いてみました。いや、結構体力使うしスタッフって大変w

だったらスタッフやめろよって言われかねないし、そう思う時もあるんだけど、最後はやっぱ「スタッフやってよかった」と思えるから怖い。

すごく要約まとめだけど、もう少し掘り下げると

今回一番大きかったのは、事前に下調べをしてそこそこの知識を持った上でセッションを聞けたことかなと。

レポート業ということで。1つのセッションに真剣になれたし、とても勉強になりました。

そしてそれをレポートという形でアウトプットする(最短で4時間以内だったかな まじエクストリームスポーツ)わけなので、更に知識が根付くというメリットがありました。

ちなみに噂のレポートたちはこちら→ http://gihyo.jp/news/report/01/sapporo-rubykaigi2012

今回、舘野さん、Aaronさん、松田さん with豪華ゲストの皆様、須藤さんのセッションを担当させて頂きました。もしレポートの内容に不備等ありましたら、 @ayako119 まで斧を投げつけるか、 @sora_h にこっそり愚痴れば3倍に増幅されて私宛に斧が吹っ飛んできますので。

あ、次回東京RubyKaigi10 行く可能性高いです

色々縁があって、東京遠征が来年1月の3連休でワンチャンありました。

こちらは多分Attendeeとして参加する可能性がとても高いのです(可能なら当日スタッフしたいけどまだ不透明)

Flickrの写真とか

後で更新します