これは何?
Ruby on Railsの開発を始めて6ヶ月くらいが経過するのですが、早めに聞いておけばサクサク開発できたのにな…という情報のまとめです(つまり初心者向けの Tipsまとめです)。随時更新する予定です。
coming soon…
レコード全体を対象とした集計関数
# == 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つのメモリ領域を共有します。
- 文字列は、同じ内容でも別々のメモリ領域を占有します。
- パフォーマンス:
- シンボルは、文字列と比較して高速にアクセスできます。
- シンボルは、ハッシュのキーとして使用される場合に特に効率的です。
シンボルを使用できる場面では、積極的にシンボルを使うのが良さそう。
モデルを追加する時の手順
- コードを自分で書いても対応できる
- が、railsコマンドを使用すると楽に対応できる
例えばProfession_Occupationというモデルを追加するには、以下のコマンドを実行します。
rails generate model ProfessionOccupation
このコマンドを実行すると、以下のファイルが生成されます。
app/models/profession_occupation.rb
: モデルのファイルdb/migrate/YYYYMMDDHHMMSS_create_profession_occupations.rb
: マイグレーションファイル(テーブル作成用)test/models/profession_occupation_test.rb
: モデルのテストファイルtest/fixtures/profession_occupations.yml
: モデルのフィクスチャファイル
マイグレーションファイルを編集して、必要なカラムを追加します。例えば、profession_id
とoccupation_id
を追加する場合は以下のようになります。
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
編集が完了したら、以下のコマンドを実行してマイグレーションを実行し、テーブルを作成します。
rails db:migrate
これで、ProfessionOccupationモデルとそれに対応するテーブルが作成されます。
また、必要に応じて、app/models/profession_occupation.rb
にアソシエーションやバリデーションを追加することができます。
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
で定義されたスキーマをデータベースに適用します。
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のレコードを参照する際のメソッド
- 少しずつ挙動が異なるので、「データを取り出すために使うメソッド」程度の粗い理解だとハマる可能性がある(ハマった)
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を個別に指定しての確認が難しい場合の書き方例
expect {
subject
}.to change(Delayed::Job, :count).by(1)
セーフナビゲーション
- フィールドを参照する前に、オブジェクトがnilかどうかを確認する
- nilだった場合、フィールドの参照を行わずにnilを返す
- 例外発生を避けられる
# userがnilの場合は、nameの参照をせずにnilを返す
user&.name
テスト系
let()
とlet!()
遅延評価の概念
let!()
: 書いた行が読まれた時点で中身の処理を実行するlet()
: 定義した変数が実際に呼ばれる時点で、中身の処理を実行する。
Factorybot
- Rspecのテストで使うもの
- テスト用のインスタンス作成を行うためのメソッドを提供するもの
create()
すると、DBへのレコード追加も行う