Open9
Ruby(Rails)勉強メモ
環境構築
Nginxのコンテナも立ててリバースプロキシする構成の方が実際の本番運用に近い?
Ruby(Rails)のスマートな書き方
String#squish
is_a?とinstance_of?どっち使ってクラスの判定すればいいか?
基本的にはis_a?でチェックするのが良さそう。
transform_values
i18nでhtmlを使う
キー名の最後に_html
を使うと良い。
html_safe
を使うよりセキュリティ的に安全。
メモ化するとき
@main_address ||= begin
maybe_main_address = home_address if prefers_home_address?
maybe_main_address = work_address unless maybe_main_address
maybe_main_address = addresses.first unless maybe_main_address
end
begin-endで囲ったブロックをまとめることができる?
nil
を除去
配列に含まれるcompact_blank
を使う。
ActiveRecord::Relation
のexcluding
where.not
のショートハンド
以下のようなSQLが発行される。
Post.excluding(post)
# SELECT "posts".* FROM "posts" WHERE "posts"."id" != 1
sendメソッド
メソッドを動的に呼び出せる。
またRspecでprivateメソッド呼び出しにも使える。
tryメソッド
オブジェクトがnilで無い場合のみ、そのオブジェクトのメソッドを実行できる。
大量のデータを扱うときに気をつけること
取得するとき
find_each
やfind_in_batches
を使う
insertやupdateするとき
バルクインサートやupdate_all
を使う
論理削除が実装されているmodelで物理削除する
really_destroy
を使用すると物理削除される。
論理削除されてるレコードも検索する
with_deleted
を使用する
文字列の範囲指定
僕の名前はテスト太郎です
という文字列があった場合。
name = "僕の名前はテスト太郎です"
name[0...4] => 僕の名前
name[5...10] => テスト太郎
こんな感じで範囲指定できる。
cloneとdupの違い
clone => 既存レコード、id同じ、リレーション維持
dup => 新規レコード、idがnil、リレーション外れる
thenの使いどころ
リファレンス
モデル・DB設計について
多対多の時
アプリケーションの将来的な変更が予測できない(サービスのスケールも含め)ので、has_many :through
の方がベターか?
テスト
RSpec
privateメソッドを呼び出す
失敗したテストだけ再実行
--only-failures
オプションを使う。
Parameterized Test
letとlet!の使い分け
- 基本的にはlet!を使う
- 参照予定の無いlet!はbeforeにする
https://zenn.dev/kyohei_shibuya/articles/722891a1a6648a
https://blog.nnn.dev/entry/2022/09/01/110000
Railsの書き方色々
ルーティング周り
resource と resourcesの違い
resource
resource
は単一のリソースに使う(userなど)
indexアクションが無し
resources
resources
は複数のリソースに使う(postなど)
indexアクションが有り
collectionとmemberの違い
Sidekiq周り
キューやジョブの確認方法
パフォーマンス改善