Posted at

RailsのReferencesとindexについて


初めに

Ruby on Railsを勉強していてよくrails g model post user:referencesみたいなのを見かける。

でもいまいちreferencesがなんなのかよくわからないので調べで見みた。


とりあえず

とりあえずrails g model post body:text user:referencesを実行してみる。

マイグレーションファイルはこんな感じ

class CreatePosts < ActiveRecord::Migration[5.2]

def change
create_table :posts do |t|
t.text :body
t.references :user, foreign_key: true

t.timestamps
end
end
end

このreferences が何なのか、foreign_keyは何なのかだが

まずreferencesは今回の場合だとuser_id:integerを書くのと同じ。

だがmodel/post.rbにbelongs_to:userというのを自動的に追加してくれる。

foreign_key: trueについては外部キー制約とかいうらしくuser_idに何でも入れれるわけではなく実際にあるuser_idしか入れれないようにするものだそう....

なのでuser:referencesと書いたらモデルにbelogns_to: userと追加してしかも外部キー制約も行うマイグレーションファイルを作ってくれる感じなのだそう。

便利だね!


indexについて

indexについてもよく見かけるがよくわかっていない。

なんか検索を行う際にあったら少し高速になるぐらいに思っていた。

調べてみたらこんな記事が出てきた。

データベースにindexを張る方法

https://qiita.com/seiya1121/items/fb074d727c6f40a55f22

この記事の最初にindexが何たるかが書いてあってテーブルの中の特定のカラムを複製し検索を早めるためにあるんだとか。

そしてむやみにindexを付ければよいわけではなく多いデータの良く検索されるカラムにindexを付与するのがよいそう

ちなみにindexを付与したい場合は

マイグレーションファイルに

add_index :users, :name  

みたいに書けばいける。

またインデックスに一意制約を付けたい場合もある。

例えばuserのemailは一意制約がついているべき。

その時にindexに一意制約を付けるには

add_index :users, :email, unique: true

と書く

またemailの場合すべてを小文字にして登録するといったことが行われる。

その際は

before_save { self.email = email.downcase }

と書けばOK


おわり

rails の references と index について理解が曖昧だったので調べながら書いてみました。

なにか間違っているところがあればご指摘いただけるとありがたいです。