TIM Labs

こんな感じにデータを持ってる sample_table があるとする。

+----+----------+------------+---------+
| id | group_id | updated_at | comment |
+----+----------+------------+---------+
|  1 |        1 | 2013-12-01 | C       |
|  2 |        2 | 2013-12-01 | A       |
|  3 |        1 | 2013-12-02 | B       |
|  4 |        2 | 2013-11-30 | D       |
+----+----------+------------+---------+

MySQL で同じデータを作成したければ、以下の SQL で再現できる。

CREATE TABLE sample_table (
    id int(11) NOT NULL,
    group_id int(11) NOT NULL,
    updated_at date NOT NULL,
    comment varchar(60) NOT NULL
);
INSERT INTO sample_table VALUES
    (1, 1, '2013-12-01', 'C'),
    (2, 2, '2013-12-01', 'A'),
    (3, 1, '2013-12-02', 'B'),
    (4, 2, '2013-11-30', 'D');

こんなデータのとき、同じグループ内であるフィールドが最大(あるいは最小)のレコードを取得したい、ということがたまにある。例では、group_id それぞれについて、 updated_at が最新のレコード、即ち comment が A および B のレコードを取得したいとしよう。

さて、どんな SQL を書けばよいだろう?

DBのスキーマ、皆様どのように管理されているでしょうか。

Railsを利用されている方の多くは、ActiveRecordのマイグレーションを利用して管理をされているかと思います。

私もいままでいくつかのRailsプロジェクトに関わってきましたが、 ほぼ全てのプロジェクトでActiveRecordのDBマイグレーションを利用してきました。 (一部のプロジェクトはActiveRecordを使っていないため、マイグレーションも独自のものを利用しています)

ActiveRecordのマイグレーションでは、DBスキーマ変更の差分情報をマイグレーションスクリプトとして保存しておきます。例えば、新しいテーブル「users」を作成する場合は、下記のようなマイグレーションスクリプトを作成します。

class AddUsers < ActiveRecord::Migration
  def up
    # ここにマイグレーション適用時の操作を書く
    create_table :users do |t|
      t.string :name
      t.datetime :created_at
      t.datetime :updated_at
    end
  end

  def down
    # ここにマイグレーション破棄した時の操作を書く
    drop_table :users
  end
end

テーブル作成/削除やカラム変更を行う際には、マイグレーションスクリプトを1つ作成します。 このように変更を管理することによって、DBスキーマを最新版へ移行させたり、任意の時点のスキーマに戻したりすることが可能です。また、スキーマの一貫性を保つことができます。

便利な機能なのですが、プロジェクトが始まったばかりの初期開発フェーズで、このマイグレーション運用をするのはかなり辛いです。

プロジェクト初期の段階では、DBの設計もちゃんと固まっていないため、スキーマ変更が頻繁に発生します。 スキーマ変更のたびにマイグレーションスクリプトを書かないといけないのは手間がかかるもので、DB修正を気軽に行うことができなくなります。

何か楽できる手立てはないものでしょうか。

前回までのあらすじ

シェフィの実装を始めた俺達はゲームを快適にプレイする為の機能を作り始めたばかり。しかしまだまだやるべき事は多い......

(※ソースコードはGitHubで公開されておりすぐに遊ぶこともできます)

前回までのあらすじ

シェフィの実装を始めた俺達だが、既にルールの実装は終えたしある程度の盤面の表示の調整も終えたところ。

多少表示を整えた盤面の様子

しかし今の実装では快適にゲームをプレイできるとは言えない状態。 まだまだやるべき事は多い......

(※ソースコードはGitHubで公開されておりすぐに遊ぶこともできます)

前回までのあらすじ

シェフィの実装を始めた俺達はようやく仮UIをまともにしようと活動を始めたばかり。何となくそれっぽい感じにカードを表示してみたものの、まだまだやることは沢山残っている。

よりビジュアル系になった図

果たしてよりカッコイイ見た目にできるのであろうか......?

(※ソースコードはGitHubで公開されておりすぐに遊ぶこともできます)

前回までのあらすじ

シェフィを実装しようと思い立った俺達はとうとう全カードの実装を終えた。ゲームそのものは実装しきったと言っても良いが、しかしそのUIは残念なまま。具体的にはこんな感じ:

残念なシェフィのUI

これでは作った当人も遊ぶ気が起きない。もっとまっとうなUIにしなければ......

テキスト編集にVimを利用しているのですが、とても奥が深い道具なので一人で使う分には気づかない機能が沢山あります。 日頃職場の先輩方から教わりとても効率的に出来るようになったVimのtipsを、いくつかこの記事にまとめます。 知ってる人は既に使いこなしているものばかりだと思いますが、Vimのそんな便利だけど気付きにくい機能を共有できればと思います。

前回までのあらすじ

シェフィを実装しようと思い立った俺達はようやくひつじを増やすカードの実装ひつじを減らすカードの実装を終えた。しかし実装すべきカードはまだいくつか残っている状態。果たして無事にゲームを実装し終えることができるのか。

前回までのあらすじ

シェフィを実装しようと思い立った俺達はとうとう個々のカードの実装に取りかかったところ。しかし実装すべきカードはまだまだ沢山残っている状態。果たして無事にゲームを実装し終えることができるのか。

前回までのあらすじ

シェフィを実装しようと思い立った俺達はゲームの大枠を遊べる状態にまで持っていけたところ。しかしカードゲームなのにカードが全く実装されていないのでカードゲームになっていない状態。果たして無事にゲームを実装し終えることができるのか。

最近のコメント