hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

よくあるミス

Rails

記法

  • ハッシュの記法
  • aタグ→link_to
  • imageタグ→image_tag
  • %button→button_tag
  • パスの指定

考え方

  • インスタンス変数生成のコードをメソッド化
  • すべての操作はリソースに対するCRUD操作にまとめる

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_paramsmove_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を開き、次のように編集する。

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にて設定を行う。