コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rails

ActiveRecordの内容に変化はないが、updated_atだけ更新したい場合はtouchを使用する

簡易な記録テーブルなどで、時刻などを更新をしたいときの豆知識 環境 $ rails -v Rails 7.1.2 やり方 該当レコードで .touch をすると自動的に保存がされる 例 book.updated_at # Thu, 01 Feb 2024 14:37:18.696490000 UTC +00:00 このようなレコードに .to…

Factory Botで数百を超えるレコードを作る場合はbuild_listとinsert_allと組み合わせると軽快に生成できる

すごく助かったのでメモがてら 環境 $ rails -v Rails 7.1.2 factory_bot (6.4.4) activesupport (>= 5.0.0) factory_bot_rails (6.4.2) factory_bot (~> 6.4) railties (>= 5.0.0) やり方について 今回の事例 下記のように1000レコードを作成するようなテス…

has_manyでorderを設定したものを無視したいときはreorderを使う

設定しているときに無視したいという特殊なケースの対策。基本は打ち消しをしないことを前提に書いたほうがよいが書かざるを得ないときにどうするかのためのメモ。 環境 $ bin/rails -v Rails 7.1.2 前提 has_manyなどの子の関連に関して、デフォルトの並び…

Railsプロダクトを考古学するときに見ると良いポイントを雑に書き出す

最初から自分が関わっていないプロダクトコードを探索する記事を書いたのですが、そこからRails特有のTipsを書き留めておきます。 考古学するときに見るといいポイント routesを常に見れる状態にする Webサービスをやっているので、大概の要望は「◯◯というペ…

factory bot の trait内に引数のように値を渡したい場合はtransientを使う

N:Nの関連性のレコードをサッとつくるためのtraitを作りたい場合のtips 環境 Gemfile.lockは以下のような環境 factory_bot (6.4.4) activesupport (>= 5.0.0) factory_bot_rails (6.4.2) factory_bot (~> 6.4) railties (>= 5.0.0) 使い方 factory_botでは一…

After Kaigi on Rails LT Nightで『無用な認知負荷を減らしてお手入れしやすいコードを書こう』という内容で登壇してきました

After Kaigi on Rails LT NightでLTしたのでその登壇後記です。 発表したスライド speakerdeck.com 伝えたかったこと 認知負荷という言葉が独り歩きしがちなので、基礎的な概念を抑えてほしかった その上で自分たちの身の回りの「課題外在性負荷」を探しても…

『Kaigi on Rails 2023』の二日目に行ってきたよメモ

『Kaigi on Rails 2023』の2日目に参加してきたので見たセッションメモ ちなみに1日目はこちら 各発表の感想 ※資料スライドは見つけたら貼ります。 Railsの型ファイル自動生成における課題と解決 speakerdeck.com 感想 Railsアプリケーションに段階的にRBSを…

『Kaigi on Rails 2023』の一日目に行ってきたよメモ

『Kaigi on Rails 2023』の1日目に参加してきたので発表見たよメモ 見た各発表の感想 ※資料スライドは見つけたら貼ります。 スケーラブルActive Jobs with Sidekiq Enterprise さきほどの Sidekiq に関するLTのスライド、こちらに掲載しましたhttps://t.co/7…

Railsで最上位までExceptionが抜けた場合にRails側でハンドリングしてくれるエラーを追加したい場合はconfigに設定を追記する

「ActiveRecord::RecordNotFoundをraiseしたときに404になるときに静的な404ページ出しているのでそれをそのまま真似て他のエラーでもキャッチしてくれないかな」という悩みを持つ人向け 検証したバージョン $ bin/rails -v Rails 7.0.6 前提としての動きの…

Railsのschema.rbを手動で更新するときは db:schema:dump で生成される

migrateして更新されずあれこれ探していたので備忘として 環境 $ bin/rails -v Rails 7.0.6 実行コマンド $ bin/rails db:schema:dump rakeとしてはこのあたりで、実装としては このあたり 動きとしての補足 通常、Railsガイドでも言及されている通りdb:migr…

Railsのconfigのgemでは、環境ごとのymlに分けた値はdeep mergeされている

当たり前なんですけど、部分的に切り取ると違和感があるので言葉でまとめる 環境 config (4.2.1) gemそのもののリポジトリは以下 rubyconfig/config: Easiest way to add multi-environment yaml settings to Rails, Sinatra, Pandrino and other Ruby proje…

Railsでsymbol表記のhttp status codeを数値に変換するときにはRack::Utils.status_codeを使うと変換できる

Rails上で render status: :not_found とかやっているが、この :not_found と 404 はどこなのか、という小ネタ。 確認した環境 $ bin/rails -v Rails 7.0.6 Railsのステータスコードのシンボル 一覧はRailsガイドにある。 レイアウトとレンダリング-2.2.13.4…

RailsでViewのErrorを減らす場合にはぼっち演算子を活用する

日頃のコードレビューの言語化です。 前提 Ruby on Railsのバージョンとしては6ぐらいを想定しています viewの記述にはerbを想定しております。 よくあるケース 例えば下記のようなテーブル構成をしているModelがあるとする create_table "users", force: :c…

Rails ConsoleにはSandboxというオプションがある

知らなかったので備忘まで。ただし万能ではないので用法用量を守って正しくお使いください。 環境 $ rails -v Rails 7.0.6 $ ruby -v ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [arm64-darwin22] どういうものか Railsコンソールには --sandbox とい…

RailsでRSpecを使う際にテストデータ用のファイルを置く場合はspec/fixtures/file配下が良さそう

CSVアップロード機能のテストなどをするときにテストデータを置きたいときのメモ 出典元 file fixture - RSpec Rails - RSpec - Relish ドキュメントいわく Rails 5 adds simple access to sample files called file fixtures.File fixtures are normal file…

Railsにてbefore_actionでredirect_toしてしまうとafter_actionなどは実行されない

actionに対しての実行なのでそのとおりといえばそのとおりなんですが備忘として。 環境 $ bin/rails --version Rails 6.0.4.1 TL;DR before_actionでredirect_toをするとafter_actionでは呼ばれない 回避案はいくつかあるが、action内でredirect_toをするな…

Rails6でpublic配下を見れるようにする設定値はconfig.public_file_server.enabled

developmentでは見れたのに、productionじゃ見れないのはなぜ…となるときに見直す設定 環境 $ bin/rails -v Rails 6.0.4.1 想定している状況 /public配下のファイルが、RAILS_ENVがdevelopmentだと見れて、productionのときに見れないときに考える設定 Rails…

Kaigi on Rails 2021 で『before_actionとのつらくならない付き合い方』という内容で登壇してきました。

Kaigi on Rails 2021 の2日目にリモート登壇してきました。 発表したスライド speakerdeck.com 伝えたかったこと before_action でインスタンス変数のセットは本当にいいことがないのでやめよう before_action の使い方がわからなくなったら横断的関心事かど…

『Kaigi on Rails 2021』の一日目みたよメモ

Kaigi on Rails 2021 の一日目見たよメモです。 各発表の感想 部分的に見れていないパートがあったので見れたものだけ ※資料スライドは見つけたら貼ります。 Q&A kamipo トークについて a_matsudaさんがモデレータという形式で話が進められていった。 以下話…

Railsでインスタンス変数に代入することをメモ化と呼ぶのは趣の違う話なのでざっくりまとめる

表題通り違和感をまとめる。 前提としてメモ化とは Wikipedia曰く以下の通り メモ化(英: Memoization)とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン(関数)の呼び…

Rubyのpumaのスレッド設定値に関して、妥当な値をドキュメントから整理する

いくつに設定すればいいのかの根拠がわからない方へ 環境 今回参照したGitHubのVersionは 5.2.2 時点のもの。 出典 出典はREADME.md puma/README.md at a99331d32e762c1b9823ab44bed92d622a65b6d3 · puma/puma pumaのスレッド数に関してREADMEには以下のよう…

ActiveRecord::Type::Boolean.new.cast はかなり揺らいだ変換になるので気をつける

昔のPHPを彷彿とさせる変換だったので書き留める 環境 $ bin/rails --version Rails 6.0.3.6 どういうことか ActiveRecord::Type::Boolean.new.cast は引数をtrueあるいはfalseに変換してくれるのだが、変換の基準は以下のものに引っかかるものがfalseになる…

ActiveSupportにはモジュール名の一部やクラス名の部分だけを取り出すためのメソッドがある

モジュールの部分はいらないんだけどな…というときに文字列処理をしなくても用意してくれている。 環境 $ bin/rails -v Rails 6.0.3.1 利用例 今回サンプルとして扱うのは以下のようなクラス module Hoge module Piyo class Test def initialize(test: nil) …

Rails6かつMySQLを使う場合に任意の順番でレコードを取得する

いろんなことの合せ技のためご利用は計画的に、という感じであるが知見まで。 環境 $ bin/rails -v Rails 6.0.3.1 今回の想定ケース 例えばUserクラスがあり、Viewにはidが2,3,1の順で並べたいのでActiveRecordの取得自体も2,3,1の順番で取得したい場合。 Us…

Railsのbefore_actionで通常のインスタンス変数をセットするのは、本当にそれが最適解か考えてからやってほしい

before_actionでインスタンス変数を設定するとミスリードが多くなりがちなのでそれに対する話。 (記事製作時)の環境 # bin/rails -v Rails 6.0.3.1 (前提として)before_actionとは ActionControllerが提供するフィルタの機能の一種。 before_action は ind…

Rails6において、rails newしたあとに標準機能を間引いていくときにみるべきところ

個別に実装を剥がして行く場合のアプローチ 環境 # bin/rails -v Rails 6.0.3.1 今回想定するシチュエーション rails new したときにオプションで間引きたかったが間引き忘れたときにどうやって対応をしていくべきかというアプローチ 見るべきところ config/…

Railsのfind***by系のメソッドを軽くまとめる

以下のツイートが気になったの調べた。 「create_or_find_by のコメントを読もう」で済む世界は最高— Takafumi ONAKA (@onk) 2020年10月27日 環境 $ bin/rails -v Rails 6.0.3.1 一覧 メソッド名 説明 find_or_create_by 対象を検索して、ない場合はCREATE(I…

Railsの raw は <%== と同じ

小ネタ そもそもrawとは 通常、erbにて変数出力をするときは以下のような構文を用いる <%= @hoge_var %> この @hoge_var にHTMLが含まれる場合はRails側でよしなにエスケープ処理がかかり、文字列として表現されるようになる。 ただし、ただのまま変数の文字…

RailsのActiveRecordでは add_column するときに after を指定すると追加するカラム位置がコントロールできる

主にMySQL向け 環境 rails (5.0.2) やり方 カラム追加の記述の場合にafterを指定する。 例 name というカラムのあとに profile_text というカラムを足したい場合 class AddColumnHogeHoge < ActiveRecord::Migration[5.0] def change add_column :users, :pr…

Rails(ActiveSupport)の blank? は false も trueになる

Railsガイドにも乗ってますが、改めてコードを掘り下げて挙動を見る。 環境 $ bin/rails -v Rails 6.0.3.1 挙動 a = true a.blank? #=> false a = "" a.blank? # => true a = false a.blank? # => true ソースコードから読む かなり明快 def blank? respond_…