redisのkeyについて調べてみた

特徴

  • バイナリセーフ
  • 文字列からjpegファイルまでキーとして扱える
  • 空文字もOK
  • 短いほうがメモリ効率がいい。
  • キーの最大長は512MB
  • ある要素を追加するとき、対象のキーが存在しない場合は、要素の追加前に データタイプの空集合(型が決まっていないもの) が作成される
  • データタイプの空集合(型が決まっていないもの) から全ての要素が削除されたとき、キーは自動的に削除される
  • 空のキーに対してread-onlyのコマンドや削除するコマンドを実行すると、空集合に対しての結果が返ってくる
  • すでにキーが存在する場合、別のデータタイプ(型)のコマンドは実行エラーになる

注意点

  • 長すぎるキーはだめ。メモリ効率が悪く、データから検索時にキーの比較に処理が重くなる
  • キーをhash化すると(e.g. sha1)、メモリ使用効率とネットワーク帯域が良くなる
  • 短すぎるキーはだめ(e.g. user:10:followingu:10:f などにする)。可読性が悪く、メモリ効率では誤差。
  • スキーマにこだわるべき。object-type:id みたいな形が有効。
    • e.g.
      • user:1000
      • comment:1234:reply.to
      • comment:1000:reply-to

コマンド

型を取得

返り値は stringlistsetzsethashnone など

1
> type "キー"

削除

削除されると 1、 削除されない、もしくはキーが存在しない場合は 0を返す

1
> del "キー"

存在判定

DBに存在すれば 1、存在しない場合 0 を返す

1
> exists "キー"

RailsでのtimezoneをUTCにする

Railsで時間情報を扱う場合、JSTだとグローバル対応した時にいろいろ面倒。

なのでデータ情報は全てUTCで扱って、取得するときのみJSTに変換するようにする。

注意点としては以下の通り。

  • modelでdatetime型に情報を渡す場合、ActiveSupport::TimeWithZone型で渡しておく。
  • modelでdatetime型から情報を受け取る場合、JST時間に変換する。
  • 現在時刻を扱う場合、Time.nowは使わずにTime.zone.nowを使う。

設定

日本在住の場合、初期設定時は以下のようになっている。

種類 初期値
Rails UTC
Rails ActiveRecord UTC
Heroku UTC
Heroku Postgres UTC
Amazon RDS UTC
OS JST
Homebrew(PostgreSQL) JST

Rails、Heroku、RDS、OS辺りは特に設定はいらない。

自分のPCにpostgreSQLをインストールした場合はtimezoneをUTCに設定しておく

以下のplaysテーブルを例として考える。

まずmodelを作成する。

1
$ rails g model play played_at:datetime

現在の時間を渡す場合

1
2
3
4
5
class Play < ActiveRecord::Base
play = Play.new()
play.played_at = Time.zone.now
play.save
end

文字列の時間を渡す場合

1
2
3
4
5
6
7
8
class Play < ActiveRecord::Base
d_time = "Mon, 27 Oct 2014 17:44:24 +0900"
played_at = DateTime.strptime(d_time, '%a, %d %b %Y %T %z').in_time_zone

play = Play.new()
hoge.played_at = played_at
play.save
end

modelから時間を取得する場合

1
2
3
4
class Play < ActiveRecord::Base
play1 = Play.find(1)
played_time = play1.played_at.in_time_zone('Tokyo')
end

has-oneが動作しなかったのでclass_nameを追加した

次のようなmodelがある。

1
2
3
4
class Detail < ActiveRecord::Base
has_one :files, :dependent => :destroy
has_one :folders, :dependent => :destroy
end

has_manyはいいんだけど、has_oneはこのままだと動作しない。
なのでclass_nameを追加する。

1
2
3
4
class Detail < ActiveRecord::Base
has_one :files, :class_name => 'File', :dependent => :destroy
has_one :folders, :class_name => 'Folder', :dependent => :destroy
end

railsに外部キー制約を追加してみた

データベースに関して調べることって、業務的な側面から、わかりづらい単語や言葉ばっかり使って理解しづらいよね。
誰でも分かるように説明するのがプロなんだよなぁ。。。。まぁいいか。

プログラミングそのものに関してはそうでもないんだけどな。なので身近にあるもので例えてみる。

外部キー(foreign key)とは

リレーショナルデータベース(RDB)で、テーブルのある列に、別のテーブルの特定の列に含まれる項目しか入力できないようにする制約。また、その際に指定する列。

参考: e-words.jp

うん言葉で言ってもわかりづらいw

図で表してみる。

この左側の赤いやつが外部キー。別のテーブルの主キーを指してるでしょ?また、別のテーブルの主キーは参照キーと呼ばれる。

外部キーの問題って?

じゃあもし外部キーの参照先が更新されたり、削除されたらどうなるか。

animeテーブルのid = 2からid = 5に更新してみる。

anime_id = 2の状態ではあるけど、指している場所にデータがない。どこ指してるかわからない。

参照整合性が取れない。いわゆる迷子レコードになる。

なぜ外部キー制約を使うか

じゃあこれをどうするかというと、以下の2通りの方法を行う。

  1. アプリ側で監視する
  2. 外部キー制約を使う

普通は1を使うんだけど、1にも以下の問題点がある。

  • スクリプトを全ての参照に対して行う必要がある
  • チェックを毎日、何回も実行しなければならない
  • 参照が壊れていた場合でも修正できるかはわからない

この位の小さいテーブルだったらスクリプトでもいいけど、親、子、孫…と何個も組み合わさっているとチェックできるかは怪しい。

そこで2の手法、外部キー制約を使う。

ちなみに、これはオライリーのSQLアンチパターン外部キー嫌いって項目で書いてある。

この本、結構面白くてSQLでダメなことが一通り書いてある。
DB設計時にこれどうすればいいんだろうってのが結構解決する。俺でも分かったから、初心者でもわかりやすいと思う。
特にパスの閉包テーブルとポリモーフィックの単一テーブル継承(Single Table Inheritance、通称STI)にはお世話になりました。

外部キー制約の種類

外部キー制約は更新時(UPDATE ON)と削除時(DELETE ON)にそれぞれ設定できる。

外部キー制約は主に4種類。

  • NO ACTION
  • RESTRICT
  • CASCADE
  • SET NULL

SET DEFAULTとかもあるけど、今回は割愛。NO ACTIONRESTRICTは同じ。

RESTRICT (NO ACTION)

子が外部キーを持っていた場合、その親の操作をさせなくする。

CASCADE

子が外部キーを持っていた場合、その親が更新や削除したら、子もそれに追従する。

SET NULL

子が外部キーを持っていた場合、その親が更新や削除したら、子にnullを代入する。

Railsではどうなの?

RailsはActiveRecord経由で操作、つまりmodelに書く。

1
2
class User < ActiveRecord::Base
has_one :animes, :class_name => 'Anime', :dependent => :destroyend

基本的には、:dependent => 制約名を追加するだけでいい。

でもこれはActiveRecord経由で操作するものだけにしか効果が無い

つまりuser1.destroyとかでは効いてもuser1.deleteでは効かない。

RailsはDB自体には制約ができない。なのでそれに対応するgem(foreigner)を入れる必要がある。

Gemの導入

Gemfileforeignerを追加。

1
gem 'foreigner'

実際に例で作成してみる

今回は次のようなテーブルの場合を考える。

usersテーブルにユーザー名、filesテーブルにファイル名。この2つが親。

playsテーブルが、どのユーザーが何のファイルを再生したかをカウントする、というもの。これが子。

playのロー(行データ)はusersテーブルとfilesテーブルに依存している。

親のロー(行データ)が更新したら子も更新し、削除されたら子も削除する。

モデルの作成は以下のコマンド。

1
2
3
$ rails g model user name:string
$ rails g model file name:string
$ rails g play count:integer file:references user:references

注意点は、一度テーブルを作成してからでないと反映できない。なので別にmigrationファイルを作成する。

1
$ rails g migration AddForeignKeyToPlays

AddForeignKeyToPlaysの部分は、AddForeignKeyToテーブル名複数形になる。

実際に作成されたmigrationファイルに外部キー制約を記入していく。書き方は3通り。

1. 繰り返しを使う

1
2
3
4
5
6
7
8
class AddForeignKeyToPlays < ActiveRecord::Migration
def change
change_table :plays do |t|
t.foreign_key :users, options: 'ON UPDATE CASCADE ON DELETE CASCADE'
t.foreign_key :files, options: 'ON UPDATE CASCADE ON DELETE CASCADE'
end
end
end

1.の場合、
t.foreign_key :users, options:とあるが、

t.foreign_key :親のテーブル名複数形, options: '付与するSQL制約'のように書く。

2. メソッドを使う

1
2
3
4
5
6
class AddForeignKeyToPlays < ActiveRecord::Migration
def change
add_foreign_key(:plays, :users, options: 'ON UPDATE CASCADE ON DELETE CASCADE')
add_foreign_key(:plays, :files, options: 'ON UPDATE CASCADE ON DELETE CASCADE')
end
end

2.の場合、
add_foreign_key(:plays, :users, options: 'ON UPDATE CASCADE ON DELETE CASCADE')とあるが、

add_foreign_key(:子のテーブル名複数形, :親のテーブル名複数形, options: '付与するSQL制約')のように書く。

3. メソッド(括弧なし)を使う

1
2
3
4
5
6
class AddForeignKeyToPlays < ActiveRecord::Migration
def change
add_foreign_key :plays, :users, options: 'ON UPDATE CASCADE ON DELETE CASCADE'
add_foreign_key :plays, :files, options: 'ON UPDATE CASCADE ON DELETE CASCADE'
end
end

3.の場合は2の括弧を外しただけ。

付与するSQL制約は、SQLによって効果が違う。
postgresqlの場合だと、以下の表通り。

種類 更新時(ON UPDATE)の効果 削除時(ON DELETE)の効果
NO ACTION 規定値。親が更新できない。 規定値。親が削除できない。
RESTRICT NO ACTIONと同じだが、制約の検査を遅らせられない NO ACTIONと同じだが、制約の検査を遅らせられない
CASCADE 親に合わせて子も更新 親に合わせて子も削除
SET NULL null値を代入 null値を代入
SET DEFAULT 自分で決めた規定値にする 自分で決めた規定値にする

なのでON UPDATE CASCADE ON DELETE CASCADEだと、更新時も終了時も親に合わせて更新、削除になる。

macでPostgreSQLをインストールする

sqliteでは外部キー制約が使えるようになったが、gemのforeignerでは使えないらしい。なのでdevelopmentの確認用にpostgreSQLを使うことにした。

macでhomebrewを用いてpostgreSQLをインストールする。

クライアント専用として使う場合

自動起動はいらないのでインストールだけでOK。

1
$ brew install postgresql

サーバとして使う場合

インストールする

1
$ brew install postgresql

homebrewで作られた起動設定ファイルにシンボリックリンクを貼る

1
$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents

ログイン時に自動起動させる。このコマンドを打った時点で起動する。

1
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

ちなみにログイン時に自動起動させなくする場合は以下のコマンド。このコマンドを打った時点で終了する。

1
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

去年位までは$ initdb /usr/local/var/postgres -E utf8ってコマンドで初期文字コードを指定していたが、2014年10月21日現在、初期値がja_JP.utf-8になっていたのでいらないっぽい。

設定ファイルを弄る

shellに設定を書き込む。

zshの場合

1
2
3
4
$ touch ~/.zprofile
$ echo 'export ARCHFLAGS="-arch x86_64"' >> ~/.zprofile
$ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.zprofile
$ source ~/.zprofile

bashの場合

1
2
3
4
$ touch ~/.bash_profile
$ echo 'export ARCHFLAGS="-arch x86_64"' >> ~/.bash_profile
$ echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.bash_profile
$ source ~/.bash_profile

ARCHFLAGSはgemで使う場合のみ追加。

PGDATA$ postgres -D /usr/local/var/postgresで起動させるがそれを$ postgresだけに省略できる。ただ自動起動の設定を使うとこのコマンドを使うことはない気がする。launchctl load -wlaunchctl unload -wで起動、終了できるし。

ちなみに.zprofile, .bash_profileはログイン時に1度しか読み込まれない。このままではシェル(terminal)を閉じると反映されない。なので一度ログアウトして反映させる。

外部公開とかはしないので、新規にユーザーを作成したりはしない。

Passwordの設定

まずpostgresにログインする

1
$ psql postgres

パスワードを設定する

1
2
postgres=# \password
postgres=# \q

このままではログイン時にパスワードを聞かれないので設定を変更する。

変更前

1
2
3
4
5
6
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust

trustをmd5にする。

変更後

1
2
3
4
5
6
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5

設定を反映させるためにpostgresを再起動する

1
2
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

パスワードを聞かれないようにする

パスワードを設定したが、ログイン時に一々聞かれると面倒。
なのでパスワードを設定ファイルに書いておく。

1
$ touch ~/.pgpass

中にはホスト名:ポート番号:データベース名:ユーザー名:パスワードのように書く。ワイルドカード*でもOK。

1
localhost:5432:*:pyarbz:hogepass

ちなみにこれは、外部にPostgresqlがある場合でも使える。アクセスするものが複数あれば、複数行書く。

TimezoneをUTCに変更する

RailsではDBにUTCとして保存し、取り出して使うときにその地域に合わせて変更した方がいいらしい。

また、Heroku PostgreSQLやAmazon RDSなど海外サーバを用いることが多いので、UTCに変更しておく。

変更前

1
2
3
4
5
6
log_timezone = 'Japan'
timezone = 'Japan'
lc_messages = 'ja_JP.UTF-8'
lc_monetary = 'ja_JP.UTF-8'
lc_numeric = 'ja_JP.UTF-8'
lc_time = 'ja_JP.UTF-8'

変更後

1
2
3
4
5
6
log_timezone = 'UTC'
timezone = 'UTC'
lc_messages = 'ja_JP.UTF-8'
lc_monetary = 'ja_JP.UTF-8'
lc_numeric = 'ja_JP.UTF-8'
lc_time = 'en_US.UTF-8'

PostgreSQLコマンド集

データベース

種類 postgres内のコマンド shellのコマンド
一覧 \l psql -l
作成 CREATE DATABASE データベース名; createdb データベース名 -U 使うユーザー名
選択 \c データベース名 psql データベース名
削除 DROP DATABASE データベース名; dropdb データベース名

テーブル

種類 postgres内のコマンド shellのコマンド
一覧 \d -
作成 CREATE TABLE テーブル名(id int, name varchar(255).....); -
削除 DROP TABLE products; -

ユーザー

種類 postgres内のコマンド shellのコマンド
一覧 \du -
作成 createuser -P ユーザー名;
作成(スーパー) createuser -s -P ユーザー名;
削除 dropuser ユーザー名
パスワード設定時のアクセス \password psql -U postgres template1
パスワード変更 ALTER USER postgres encrypted password 'パスワード'; -

その他

種類 postgres内のコマンド shellのコマンド
終了 \q またはctrl+d -
help \? -

migrateコマンドを省略する

railsでDBに反映するにはmigrateするが、リセットして一からやり直したいことがある。
その時は普通以下のコマンドを入力する。

1
2
3
$ rake db:drop
$ rake db:create
$ rake db:migrate

ただし3回も打つのは面倒臭い。なので一行で打つとこうなる。

1
$ rake db:drop db:create db:migrate

さらにこれはもっと省略できて、以下のコマンドで実現できる。

1
$ rake db:migrate:reset

railsで多対多のテーブルを実装する

railsでmodelを作成するとき、多対多の実装方法が分かりづらかったのでまとめてみた。
railsでの多対多の書き方はいろいろあるらしい。

  1. 中間テーブルを作成し、has_many :throughを使う
  2. has_and_belongs_to_manyを使う
  3. create_join_tableを使う

1 → 3の順に情報が多い気がする。手軽さ的には 3 → 1の順かな。

個人的には1がおすすめ。理由としては、中間テーブル名を用いてDBにアクセス出来ることと、中間テーブルに属性を後で付加できるから。

例として画像にtagデータを持たせるテーブルを考える。

Toxi法で多対多のテーブルを作成する。railsの規約に沿ってDB設計をした。ER図は以下の通り。

1の場合

2, 3の場合

imagesテーブルにはnameURLの情報を保存し、tagsテーブルにはnameの情報を保存させる。tag_idimage_idは外部キー。

違いは中間テーブルの有無だけで、やってることは同じ。実際にはrailsが中間テーブルを自動生成してくれるので、2,3も1のようなテーブルになる。

ではER図を元にrailsで実装してみる。

1. 中間テーブルを作成し、has_many :throughを使った場合

rails g modelコマンドを用いて、テーブルを作成する。

1
2
3
$ rails g model image name:string url:string
$ rails g model tag name:string
$ rails g model image_tag image:references tag:references

テーブル名が単数形であることに注意。railsではActive Record経由で自動的に複数形にしてくれる。

中間テーブルと関連付けさせる。

1
2
3
4
class Image < ActiveRecord::Base
has_many :image_tags
has_many :tags, :through => :image_tags
end
1
2
3
4
class Tag < ActiveRecord::Base
has_many :image_tags
has_many :images, :through => :image_tags
end
1
2
3
4
class ImageTag < ActiveRecord::Base
belongs_to :image
belongs_to :tag
end

ちなみにmigrateファイルは以下のようになっている。

1
2
3
4
5
6
7
8
9
10
class CreateImages < ActiveRecord::Migration
def change
create_table :images do |t|
t.string :name
t.string :url

t.timestamps
end
end
end
1
2
3
4
5
6
7
8
9
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name

t.timestamps
end
end
end
1
2
3
4
5
6
7
8
9
10
class CreateImageTags < ActiveRecord::Migration
def change
create_table :image_tags do |t|
t.references :image, index: true, null: false
t.references :tag, index: true, null: false

t.timestamps
end
end
end

外部キーにnot null制約を付加している。

最後にマイグレートする

1
$ rake db:migrate

2. has_and_belongs_to_manyを使った場合

rails g modelコマンドを用いて、テーブルを作成する。

1
2
3
$ rails g model image name:string url:string
$ rails g model tag name:string
$ rails g migration create_images_tags image:references tag:references

中間テーブルは作らない。migrationファイルで関連付けさせる。

テーブルを関連付けさせる。

1
2
3
class Image < ActiveRecord::Base
has_and_belongs_to_many :tags
end
1
2
3
class Tag < ActiveRecord::Base
has_and_belongs_to_many :images
end

migrationファイルを編集する

元のファイル

1
2
3
4
5
6
7
8
class CreateImagesTags < ActiveRecord::Migration
def change
create_table :images_tags do |t|
t.references :image, index: true
t.references :tag, index: true
end
end
end

これをhas_and_belongs_to_manyの規約で編集する

has_and_belongs_to_many アソシエーションの規約

  • 中間テーブルを作成しなければならない。
  • 中間テーブルのテーブル名は参照先のテーブル名を辞書順に「_」で連結しなければならない。(※)
  • 中間テーブルの主キー列を無効化しなくてはならない。
  • 中間テーブルの外部キー列は「参照先のモデル名_id」の形式にしなければならない。
  • 中間テーブルのタイムスタンプ列を削除しなくてはならない。

変更後

1
2
3
4
5
6
7
8
class CreateImagesTags < ActiveRecord::Migration
def change
create_table :images_tags, id: false do |t|
t.references :image, index: true, null: false
t.references :tag, index: true, null: false
end
end
end

外部キーにnot null制約を付加している。

変更前にid: falseを追加しただけ。外部キー名を明記しないのは、自動生成してくれるため。

ちなみに他のmigrateファイルは以下のようになっている。

1
2
3
4
5
6
7
8
9
10
class CreateImages < ActiveRecord::Migration
def change
create_table :images do |t|
t.string :name
t.string :url

t.timestamps
end
end
end
1
2
3
4
5
6
7
8
9
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name

t.timestamps
end
end
end

最後にマイグレートする

1
$ rake db:migrate

3. create_join_tableを使った場合

rails g modelコマンドを用いて、テーブルを作成する。

1
2
3
$ rails g model image name:string url:string
$ rails g model tag name:string
$ rails g migration create_join_table_images_tags image tag

中間テーブルは作らない。migrationファイルで関連付けさせる。

テーブルを関連付けさせる。

1
2
3
class Image < ActiveRecord::Base
has_and_belongs_to_many :tags
end
1
2
3
class Tag < ActiveRecord::Base
has_and_belongs_to_many :images
end

migrationファイルを編集する

元のファイル

1
2
3
4
5
6
7
8
class CreateJoinTableImagesTags < ActiveRecord::Migration
def change
create_join_table :images, :tags do |t|
# t.index [:image_id, :tag_id]
# t.index [:tag_id, :image_id]
end
end
end

コメントアウトを外す。

変更後

1
2
3
4
5
6
7
8
class CreateJoinTableImagesTags < ActiveRecord::Migration
def change
create_join_table :images, :tags do |t|
t.index [:image_id, :tag_id]
t.index [:tag_id, :image_id]
end
end
end

ちなみに他のmigrateファイルは以下のようになっている。

1
2
3
4
5
6
7
8
9
10
class CreateImages < ActiveRecord::Migration
def change
create_table :images do |t|
t.string :name
t.string :url

t.timestamps
end
end
end
1
2
3
4
5
6
7
8
9
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name

t.timestamps
end
end
end

最後にマイグレートする

1
$ rake db:migrate

railsのmodelについて調べてみた

railsでmodelを操作するときは、以下のコマンドを使う。

作成

1
$ rails g model テーブル名 カラム名:型 カラム名:型 ・・・

削除

1
$ rails d model テーブル名 カラム名:型 カラム名:型 ・・・

作成はg、削除はd。

また、外部キーを追加する場合にはこうする。

作成(外部キー有)

1
$ rails g model テーブル名 カラム名:型 カラム名:型 外部キーのテーブル名:references

削除(外部キー有)

1
$ rails d model テーブル名 カラム名:型 カラム名:型 外部キーのテーブル名:references

既存のテーブルに外部キーを追加する場合は、上記のコマンドでは追加できない。その場合はmigrationを用いる。

1
$ rails g migration テーブル名 外部キーのテーブル名:references

ちなみに、railsには以下の規約がある。なので上記のテーブル名は小文字かつ単数形である必要がある。

テーブル名とクラス名

  • テーブル名は複数形
  • 単語の区切りはアンダーバー(_)
  • 対応するクラス名は単語の先頭を大文字にして _ を取り除いたもの

キーのカラム名

  • 主キーのカラム名は「id」
  • 外部キーのカラム名は「テーブル名の単数_id」

日付関連のカラム名

  • DATE型のカラムには名前を 「受動態_on」
  • TIMESTAMP型のカラムには名前を「受動態_at」
  • 更新日時、作成日時は「updated_at」、「created_at」

結合テーブル

  • 関連させたいテーブル名をくっつけた名前にする
  • カラム「id」を作らずに、関連させる2つのキーのセットを主キーにする

参考: Railsドキュメント

型一覧

rails g model sqlite mysql postgresql ruby
:binary bolb bolb bytea String
:boolean boolean tinyint(1) boolean TrueClass/FalseClass
:date date date date Date
:datetime datetime datetime timestamp Time
:decimal decimal decimal decimal BigDecimal
:float float float float Float
:integer integer int(11) integer Fixnum
:string varchar(255) varchar(255) character varying(256) String
:text test text text String
:time datetime time time Time
:timestamp datetime datetime timestamp Time

ちなみに主キーは自動的に作成されるので、rails g id:primary_keyとかで作る必要はない。

あとは以下のコマンドで反映させればOK

1
rake db:migrate

DBを反映前の状態に戻したい場合は以下のコマンドを使う。

DBを1つ前に戻す

1
$ rake db:rollback

DBを最初に戻す

1
$ rake db:migrate VERSION=0

railsでよく出てくる、似たようなものを調べてみた。

railsで調べていると、よく似たものが出てくる。わかりづらいのでメモ。

HTML

  • erb
    • デフォルトのやつ。
    • 基本はhtmlそのもの。
    • ruby埋め込みは<%= %>
  • haml(yaml)
    • ちょっとふるいやつ。
    • <>の代わりに%を用いる
  • slim
    • 新しいやつ。
    • cssやjqueryと記法が似ている。
    • classは.
    • idは#
    • ruby埋め込みは=
    • gem 'slim-rails'でインストール

javascript

  • coffee scrpit
  • type script

CSS

  • scss
    • コンパイラはruby。デフォルト。
  • sass
    • デフォルトで使えるが、拡張子を.sass変更する。
    • scssから{}が取れた感じ。
  • less
    • コンパイラはjavascript。
    • gemにrubyracerが必要

gem

処理の高速化

  • spring rails4のデフォ。最近はこれ。
  • zeus 古いやつ
  • spork 古いやつ

変更の監視

デバッグ

  • pry-rails irbの強化版ipythonみたいなもん。rails consoleでも動作する。
    • pry-byebug pry中にデバッグできる。ブレイクポイントを設置したり。ruby2ではこっち
    • pry-debugger pry中にデバッグできる。ブレイクポイントを設置したり。ruby2では動作しない

TDD

  • rspec-rails 言わずもがなrspec本体
  • factory_girl_rails テストDBにデータを用意できる。主にmodel側のテスト。
  • fixture →factory_girlと同じ。factory_girlのほうが上
  • capybara 操作やフォーム入力などをエミュレートしてくれる。主にview側のテスト。APIには向かない。

binstub

  • railsアプリ/binに実行ファイルを置いてくれる。bundle install --binstubs path