よくあるミス
Rails
記法
- ハッシュの記法
- aタグ→link_to
- imageタグ→image_tag
- %button→button_tag
- パスの指定
考え方
DB関係
- 外部キーの設定
- 外部キーをreferences型にする
- インデックスの設定
- n+1 問題を考慮する
Git
- 必要ないテストファイル、coffeeファイル、helperファイルの削除
- 画像ファイルをコミットしない
- ユーザーの投稿によって増えるような画像はコミットしないようにする。(画像投稿機能で使用するGemのCarrierWaveでは、public/uploads以下に画像が増え続ける。)
- コメントで指摘された箇所に関しては、コメントに対しリアクションをするか、「修正しました」など簡単なコメントにする。
Rails
記法
ハッシュの記法
ハッシュの記法で、「=>」という記法(ハッシュロケットという)があるが、こちらは古い記法なので、「:」ですべて記述する。
aタグ→link_to
aタグを使わずに、すべてlink_toで記述。
imgタグ→image_tag
imgタグを使わずに、すべてimage_tagで記述。
buttonタグ→button_tag
buttonタグを使わずに、すべてbutton_tagで記述。
パスの指定
パスを指定する際には直接URLを指定するのではなく、ヘルパーメソッドを使用。
1 2 |
○: new_user_session_path
×: /users/sign_in
|
考え方
インスタンス変数生成のコードをメソッド化
コントローラー内で繰り返し使用されるコードは、private以下でメソッド化する。
以下はpictweetから抜粋したコード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class TweetsController < ApplicationController
before_action :move_to_index, except: [:index, :show]
def index
@tweets = Tweet.includes(:user).order("created_at DESC").page(params[:page]).per(5)
end
~省略~
private
def tweet_params
params.permit(:image, :text)
end
def move_to_index
redirect_to action: :index unless user_signed_in?
end
end
|
private以下に定義されているtweet_params
とmove_to_index
に注目。tweet_params
に関しては保存や更新時に呼ばれるメソッド。move_to_index
はindexとshowアクションが呼ばれる以外の場合に実行されるメソッド。
いずれもあらゆる場合で繰り返し使用されるメソッドのため、private以下にメソッド化している。
DB関係
外部キーの設定
外部キーとは
外部キーとは、テーブルにある列に別のテーブルの特定の列に含まれる項目しか入力できないようにする制約、また、その際に指定する列。
親キーにまだ存在しない値が外部キーに設定された際には、エラーが生じるようになっている。(外部キー制約)
外部キーを設定する意味
外部キーを設定することで、
参照するカラム(カラム名_id
)に不適切な値が設定されることを防ぎ、データベースの一貫性を保つことができる。
1 2 3 4 |
Comment.create(tweet_id: 1000, user_id: 6)
# 存在しえないtweetの指定
ActiveRecord::InvalidForeignKeyを返す
# => ActiveRecord::InvalidForeignKey: Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails
|
外部キーをreferences型にする
テーブル間でアソシエーションをつなぐときに、所属するテーブルのidを保存するカラムを作成する際には、reference型でカラムを作成する。pictweetのcommentsテーブルは、userとtweetの外部キーが必要なので下記のようになる。
1 2 3 4 5 6 7 8 |
class Comments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.references :tweet, index: true, foreign_key: true,
t.references :user, index: true, foreign_key: true
end
end
end
|
インデックスの設定
インデックスとは
インデックスとは、データの速度検索向上をさせるために、どの行がどこにあるかを示した索引のことを指す。いわゆる本の目次みたいなもの。
インデックスを貼るメリット
・データの読み込み/取得速度向上
本来は、目的のデータが見つかるまですべての行を調べるが、牽引を利用して目的の場所のみをみつけてから、その行のデータを読み取るので、データの読み込み速度が早くなる。
インデックスを貼るデメリット
・書き込み速度低下
インデックスとはテーブルのデータとは別の領域に保存される。
そのため、データを書き込んだ際に、テーブルへの書き込み、インデックスへの書き込みが必要になるため、書き込み速度が低下する。
N+1 問題を考慮
モデルを利用してデータベースにアクセスをする際にSQLが発行される。
アソシエーションの利用して、子モデルのインスタンスを複数取得する際には、N+1
問題があることを考慮する。includes
メソッドなど使用することでN+1
問題を解消することができる。
Git
必要ないtestファイル、coffeeファイル、helperファイルの削除
使われていないファイルはすべて削除する。
あるいは、rails g
コマンドを実行した際にこのようなファイル群を生成しないようにすることができる。config/application.rbを開き、次のように編集する。
1 2 3 4 5 6 7 8 9 10 11 |
# 省略
module ChatSpace
class Application < Rails::Application
config.generators do |g|
g.stylesheets false
g.javascripts false
g.helper false
g.test_framework false
end
end
end
|
画像ファイルをコミットしない
ユーザー登録などで画像を設定するが、それはrailsファイル内に保存されてしまう。
すべてのファイルをコミットしてしまうと画像がgitにも登録されてしまう。
画像ファイルをコミットしないようにする。
あるいは、コミットが無視されるようにgitignoreにて設定を行う。