コード日進月歩

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

Rails

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_…

Railsのmigrationでカラムコメントをつけたいときは comment で記述できる

Railsだとmigrateファイルあるからいらんって言われがちだけどつけたいよね、っていうメモ 環境 rails (5.0.2) やり方 カラム指定時に comment: "書きたいコメント" をつければOK 例 class AddColumnHogeHoge < ActiveRecord::Migration[5.0] def change add…

Dockerを使って手元の環境にRubyやRailsを入れずにrails newした結果を手に入れる

パーフェクトRails読んでたら「まずはDockerイメージを作成する前に、サンプル用のRails アプリケーションを作成しましょう」と出てきたので、それすらも俺はDocker出やりたいんだ!と思ったので頑張ってみた 前提 dockerは使えるが、ローカルのrubyのバージ…

RubyのテンプレートエンジンSlim内でJavaScriptを直接記述し、scriptタグに属性をつける場合の書き方

たまに広告用のタグとかもらったときに書き方忘れているのでメモ。PHPの軽量フレームワークではないです。 環境 slim-template/slimの下記バージョン slim (3.0.9) やり方 属性がいらない場合 javascript: のショートカットが使える javascript: alert('Slim…

RailsのMigrationで reffrenceの too_longを解消する書き方

refferenceの場合、indexが生成されるが自動生成のindex名が長くなってしまう場合の解消例 環境 bin/rails -v Rails 5.0.2 事象 referenceで指定した場合、Railsのindex名のルールが index_{{ベーステーブル名}}_on_{{リファレンス先のテーブル名}}_id のた…

ActionPack variantsを使うと、Viewテンプレートファイルを分けて扱うことができる

スマホ向けにテンプレ分けたいわーというニーズ向け 環境 rails (5.0.2) Action Pack Variants とは Ruby on Rails 4.1 リリースノート - Railsガイド ざっと説明すると request.variant にシンボル値をセットすることで、そのシンボル値が付加されているvie…

enumの日本語化を実現するgem「enum_help」

ほう、こんなものが…という既存プロジェクトに入ってたgemをメモるシリーズ 出典 GitHub - zmbacker/enum_help: Help ActiveRecord::Enum feature to work fine with I18n and simple_form. 環境 rails (5.0.2) enum_help (0.0.17) 効能 gemを入れたら confi…

RSpec(rspec-rails)のrails_helperの初期設定は「RAILS_ENVがなければtestにする」という設定なので気をつける

RAILS_ENVを意図的に設定しているとRSpecが動かない場面に遭遇するので気をつける、というメモ。 環境 rspec-rails (3.8.1) 該当記述 rails g rspec:install で生成されるファイルのテンプレートは以下のような記述になっている ENV['RAILS_ENV'] ||= 'test'…

Railsでlayoutを使いたくないときは layout false

あ、nilじゃなくてfalseなんだというメモ。 環境 gem 'rails', '= 5.0.2' やり方 Controllerに下記のように書く class HogeController < ApplicationController layout false 利用シーン 考えてみたが全然なく、今回利用した経緯としては 既存のテンプレート…

Railsのcontent_forは別のpartialに記述したものでも動くが、順番や場所によって挙動が変わる

読み込み順番によって変わるやつ。ということで なるべく使わないほうがいい けど動作だけ 環境 rails (5.0.2) 動作概要 通常のviewテンプレートの yield の 記述の前に content_for を 含むpartialを render すれば出てくる。 逆にyield の 記述のあとに co…

Railsコンソールでの実行をシェルからワンライナーで行うときに使える runner

よく忘れるのでメモ 環境 $ bin/rails -v Rails 5.2.2 使う機能 runnerコマンドを使うと、非対話的にRailsの文脈でRubyのコードを実行することができます。 - Rails のコマンドラインツール - Rails ガイド - 1.6 rails runner 使い方 $ bin/rails r "p User…

Railsのenvは production / test / developmentで動かそう

教訓的なメモ Railsの基本的なenvironment(env) Railsでデフォルトで存在するのは以下の3つ produciton(本番) test(テスト/Rspecなどの実行用) development(開発環境) envは増やせる、が このenv、増やすことができる。根本的には config/environments…

Date.todayはサーバーのタイムゾーン、Date.currentはRailsのタイムゾーンを意識して変換する

明確にズバーン!というのがなかったので書く 該当コード https://github.com/rails/rails/blob/6504d51a78a86a0994aa0f461e769e68d217361f/activesupport/lib/active_support/core_ext/date/calculations.rb#L48 Date.todayとは class Date (Ruby 2.6.0) - …

ActiveRecordのレコード数を測るときはsizeでやると大体がよしなにやってくれる

ソースコードを見ると明白なのでさらっとまじえつつ sizeとcountの処理の違い sizeは loaded? でロード状態であればサイズそのものを使う。以下は執筆時点masterのコード def size loaded? ? @records.length : count(:all) end いっぽうcountは特に回避コー…

『Rails Developers Beer Bash 〜Railsのトレンドとこれから〜』に行ってきたよメモ

Unite2019Tokyoを早めに切り上げて勉強会はしご、本業のほうのRailsの勉強会である、Rails Developers Beer Bash 〜Railsのトレンドとこれから〜 に行ってきたよメモ 各発表の感想 2週間でRails5.1 > Rails6 タイムアタックチャレンジ 資料でっす #railsbeer…

Railsの5.2系からブロックなしのtravel_toに対してtravel_backを明示的に書かなくてもよくなった

travel_backってどこで使うんだ…?と使い所に関して挙動を確認してたらたどり着いたメモ。 環境 $ bin/rails -v Rails 5.2.2 理由と解説 travel_back というリアル時刻に戻す機能があるのだが、一昔の前のブログをさがすと「ブロックなしの travel_to をした…

Railsにてモデルの内容を人間の読める形式に変換する human 系の処理

あ、これi18nなのねという感じ。 環境 $ bin/rails -v Rails 5.2.2 概要 i18nに沿って、設定したlocaleに対応するモデル情報を表示する やり方 対応する情報を設定する i18nの形式で情報をymlに書き込む。日本語情報を作りたい場合は config/locales/ja.yml …

Rails.env はどうやって導きだされるのかざっくり調べる

該当コードを調べてみるシリーズ 環境 $ bin/rails -v Rails 5.2.2 該当コード rails/railties/lib/rails.rbのここらへん # Returns the current Rails environment. # # Rails.env # => "development" # Rails.env.development? # => true # Rails.env.prod…

ActiveSupportにはdate型に対してその日の範囲を作るall_dayというメソッドがある

前にまとめたけど、こんなんのもあるのかというメモ 環境 $ bin/rails --version Rails 5.2.2 やり方 all_dayメソッドを使うだけ date = "2019-08-17".to_date # => Sat, 17 Aug 2019 date.all_day # => Sat, 17 Aug 2019 00:00:00 UTC +00:00..Sat, 17 Aug …

Railsで with_indifferent_access を使うときは一呼吸おいて考えて欲しい

ただのコラム (この話を題材にする)環境 $ bin/rails -v Rails 5.2.2 with_indifferent_accessというメソッド Hashの拡張機能としてAvtiveSupportが用意しているメソッド rails/hash_with_indifferent_access.rb at master · rails/rails · GitHub Hashの…