キリンめも

記事を書いています #rails #swift #JS #UE4

Railsの会25日目[dup /インデックス/pg (0.18.4) ]

今回の範囲(続き)
f:id:geta206:20170613165707p:plain

インデックス

データベースの世界で、インデックス(索引)とはテーブルに格納されているデータを高速に取り出す為の仕組みです。
基本: カラムに対してインデックスをつける。

ALTER TABLE landing_pages ADD INDEX index_name(user_id)

インデックスが早い時

1. テーブル内のデータ量が多く、少量のレコードを検索する場合
2. WHERE句の条件、結合の条件、ORDER BY句の条件として頻繁に利用する
ただし全表走査が目的のテーブルであれば索引は不要
3. NULL値が多いデータから、NULL値以外の検索をする

IndexはNULLを含まないのでNULL値以外の検索には効果がある

indexを導入しない方がいい時

1.表の規模が小さいか、表から大部分のレコードを検索する場合
2.WHERE句等の条件としてあまり仕様されないもの
3.列の値が頻繁に挿入、更新、削除される
4.Indexは表に新規行が挿入されればIndexにも自動的に値が格納される。そのためデータの検索速度は向上するが挿入、更新、削除の処理では索引のメンテナ
ンス作業が発生し、速度低下につながる
5.WHERE句の条件として使用されるが、列が式の一部として参照される
MySQLのIndexをはるコツ - Qiita

validation

1. validatesを使い、モデルクラスに検証する条件を定義する。

# 商品名は必須
validates :title, presence: true

2. コントローラーなどでモデルを保存/更新する。

if @product.save
redirect_to @product, notice: '商品を作成しました'
else
render :new
end

3. バリデーションエラー時には、errorsにエラーメッセージが設定されるので、それを表示する

Rails 4でモデルのバリデーションまとめ - Rails Webook

一意性 (ユニーク制約)のチェック

指定した属性がユニーク(一意:意味や値が一つに確定していること。)検証する。

Rails 4でモデルのバリデーションまとめ - Rails Webook

dup

元のオブジェクトと同じクラスの新しいオブジェクトで、
元のオブジェクトのインスタンス変数を新しいオブジェクトにコピーしたもの。

h = Hoge.new
hd = h.dup

h.name = 'name'
hd.name = 'dup'
h.name #=> 'name'

clone, dup (Object) - Rubyリファレンス

uniqueness

指定した属性がユニークであることを検証する。

# 定義
validates email, uniqueness: true # 値がユニークであれば検証成功

# テスト
it { is_expected.to validate_uniqueness_of(:email) }

Rails 4でモデルのバリデーションまとめ - Rails Webook

upcase / downcase

self.email = email.downcase

before_save

セーブする直前に毎度呼び出される。

before_save{ self.email = email.downcase }

コールバック

バリデーションの実行、DBの保存などのタイミングで処理を行うための機能。

一部例

  1. after_validation #検索メソッドでオブジェクトが見つかったタイミングで実行
  2. before_save #オブジェクトがインスタンス化されたタイミングで実行

» Railsのコールバックまとめ TECHSCORE BLOG

Bundler cannot continue.のエラーが出た時

An error occurred while installing pg (0.18.4), and Bundler cannot
continue.
Make sure that `gem install pg -v '0.18.4'` succeeds before bundling.

解決策

その1

brew install postgressql
bundle update

その2
$ bundle install --without production