60
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#初めに

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 について理解が曖昧だったので調べながら書いてみました。

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

60
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?