【Ruby on Rails】【初心者向け】早めに知っておくべきことメモ

これは何?

Ruby on Railsの開発を始めて6ヶ月くらいが経過するのですが、早めに聞いておけばサクサク開発できたのにな…という情報のまとめです(つまり初心者向けの Tipsまとめです)。随時更新する予定です。

Active Record

coming soon…

レコード全体を対象とした集計関数

Ruby
# == Schema Information
#
# Table name: student
#
#  id         :bigint           not null, primary key
#  name       :string           not null
#  score      :bigint           not null
#  created_at :datetime
#  updated_at :datetime
#
class Student < ApplicationRecord

  def self.max_score_gap
    # このメソッドは、スコアの最大値と最小値の差を返す
    max_score = maximum(:score)
    min_score = minimum(:score)
    max_score - min_score
  end
end

シンボルとは何か

  • :idなど、コロンから始まるもの。
  • javaにおけるintのように、同一の値を持つインスタンスが1つしか作られないもの
  • 「定数の文字列」くらいのイメージで扱えば、初段階の実用上は困らなさそう。

シンボルの主な特徴と利点は以下の通り。

  1. 一意性:
    • シンボルは一意のオブジェクトです。同じ名前のシンボルは、アプリケーション全体で同じオブジェクトを参照します。
    • 文字列は、同じ内容でも別々のオブジェクトとして作成されます。
  2. 不変性:
    • シンボルは不変(イミュータブル)です。一度作成されたシンボルの値は変更できません。
    • 文字列は変更可能(ミュータブル)です。
  3. メモリ効率:
    • シンボルは一意のオブジェクトであるため、同じ名前のシンボルは1つのメモリ領域を共有します。
    • 文字列は、同じ内容でも別々のメモリ領域を占有します。
  4. パフォーマンス:
    • シンボルは、文字列と比較して高速にアクセスできます。
    • シンボルは、ハッシュのキーとして使用される場合に特に効率的です。

シンボルを使用できる場面では、積極的にシンボルを使うのが良さそう。

モデルを追加する時の手順

  • コードを自分で書いても対応できる
  • が、railsコマンドを使用すると楽に対応できる

例えばProfession_Occupationというモデルを追加するには、以下のコマンドを実行します。

bash
rails generate model ProfessionOccupation

このコマンドを実行すると、以下のファイルが生成されます。

  1. app/models/profession_occupation.rb: モデルのファイル
  2. db/migrate/YYYYMMDDHHMMSS_create_profession_occupations.rb: マイグレーションファイル(テーブル作成用)
  3. test/models/profession_occupation_test.rb: モデルのテストファイル
  4. test/fixtures/profession_occupations.yml: モデルのフィクスチャファイル

マイグレーションファイルを編集して、必要なカラムを追加します。例えば、profession_idoccupation_idを追加する場合は以下のようになります。

ruby
class CreateProfessionOccupations < ActiveRecord::Migration[6.1]
  def change
    create_table :profession_occupations do |t|
      t.integer :profession_id  # 追記したカラム
      t.integer :occupation_id # 追記したカラム

      t.timestamps
    end
  end
end

編集が完了したら、以下のコマンドを実行してマイグレーションを実行し、テーブルを作成します。

bash
rails db:migrate

これで、ProfessionOccupationモデルとそれに対応するテーブルが作成されます。

また、必要に応じて、app/models/profession_occupation.rbにアソシエーションやバリデーションを追加することができます。

ruby
class ProfessionOccupation < ApplicationRecord
  belongs_to :profession
  belongs_to :occupation
  validates :profession_id, presence: true # 追記したバリデーション
  validates :occupation_id, presence: true # 追記したバリデーション
end

以上の手順で、Profession_Occupationモデルを追加することができます。

ridgepole

  • DBの状態設定に使うもの

例えば以下のコマンドを使うと、事前に用意したdb/Schemafile で定義されたスキーマをデータベースに適用します。

bash
bundle exec ridgepole -c config/database.yml -E development -f db/Schemafile --apply

パラメータの説明

  • bundle exec を使用して、プロジェクトの Gemfile 内で指定された ridgepole を実行します。
  • -c config/database.yml: データベース接続設定ファイルとして config/database.yml を使用します。
  • -E development: 実行環境を development(開発環境)に設定します。
  • -f db/Schemafile: スキーマ定義ファイルとして db/Schemafile を使用します。
  • --apply: スキーマの変更を実際にデータベースに適用します。

find(), find_by(), where()

  • DBのレコードを参照する際のメソッド
  • 少しずつ挙動が異なるので、「データを取り出すために使うメソッド」程度の粗い理解だとハマる可能性がある(ハマった)

ApplicationJob

perform_laterとperform

  • 普通JobのクラスをApplicationJobを継承して作る
  • 実装する必要があるのはperformのみ
  • perform_laterを呼ぶと、最終的にはperformが呼ばれる。
  • RSpecでテストする場合の注意点
    • performに渡された引数を確認したい場合、確認するキューを正しく指定できているかどうか。

テストのチートシートのようなもの
https://www.rubydoc.info/gems/rspec-rails/RSpec%2FRails%2FMatchers%3Ahave_enqueued_job

queueを個別に指定しての確認が難しい場合の書き方例

Ruby
      expect {
        subject
      }.to change(Delayed::Job, :count).by(1)

セーフナビゲーション

  • フィールドを参照する前に、オブジェクトがnilかどうかを確認する
  • nilだった場合、フィールドの参照を行わずにnilを返す
  • 例外発生を避けられる
Ruby
# userがnilの場合は、nameの参照をせずにnilを返す
user&.name

テスト系

let()let!()

遅延評価の概念

  • let!(): 書いた行が読まれた時点で中身の処理を実行する
  • let(): 定義した変数が実際に呼ばれる時点で、中身の処理を実行する。

Factorybot

  • Rspecのテストで使うもの
  • テスト用のインスタンス作成を行うためのメソッドを提供するもの
  • create()すると、DBへのレコード追加も行う

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.