FactoryBot 6.0 から enum の traits が自動生成されるようになった
はじめに
2020 年 6 月にリリースされていた FactoryBot バージョン 6.0.0 から ActiveModel の enum の列挙子ごとに traits が自動で作られるようになっていました。これについて技術記事があまりなかったので書いてみることにしました。
例えば以下のような status
という enum のカラムをもつ Task
モデルがあるとします。
# app/models/task.rb class Task < ActiveRecord::Base enum status: {queued: 0, started: 1, finished: 2} end
v6.0以前では traits を書く必要があった
6.0 以前では factory の定義に自分で traits を書く必要があるので面倒です。
# spec/factories/tasks.rb FactoryBot.define do factory :task do trait :queued do status { :queued } end trait :started do status { :started } end trait :finished do status { :finished } end end end
v6.0 以降では traits を書く必要がなくなった
Added: automatic definition of traits for Active Record enum attributes, enabled by default
6.0 以降で factory の定義だけを書きます。
FactoryBot.define do factory :task do end end
これだけで enum の traits が使えるようになります。
task = FactoryBot.build(:task, :started) task.status #=> "started"
詳しくは GETTING_STARTED とPRをご覧ください。
おわりに
とても便利な機能なのでまだ FactoryBot 6.0 未満を使っている方はバージョンアップすることをオススメします。
Ruby 3.0 で Hash のキーを別のキーに置換する方法
例えば {foo: 1, bar: 2, baz: 3}
という Hash のキーのうち、 :baz
を :foobar
に置換して {foo: 1, bar: 2, foobar: 3}
にしたいとします。
Ruby 2.7 以前の場合
Ruby 2.7 以前だと Hash#transform_keys
のブロックの中で条件分岐させたりと少し面倒です。
# 2.7.2 hash = {foo: 1, bar: 2, baz: 3} hash.transform_keys { |key| key == :baz ? :foobar : key } #=> {:foo=>1, :bar=>2, :foobar=>3}
Hash#transform_keys (Ruby 3.0.0 リファレンスマニュアル)
他には Hash#delete
を使って元の Hash を破壊してしまう方法もあります。
# 2.7.2 hash = {foo: 1, bar: 2, baz: 3} hash[:foobar] = hash.delete(:baz) hash #=> {:foo=>1, :bar=>2, :foobar=>3}
Hash#delete (Ruby 3.0.0 リファレンスマニュアル)
Ruby 3.0 の場合
Ruby 3.0 では Hash#transform_keys
の引数に {置換前のキー => 置換後のキー}
の Hash を渡すことで簡単に置換できます。
# 3.0.0-preview2 hash = {foo: 1, bar: 2, baz: 3} hash.transform_keys(baz: :foobar) #=> {:foo=>1, :bar=>2, :foobar=>3}
参考
Ruby で使われる OpenSSL のバージョンを更新する
先日 OpenSSL 1.1.1i がリリースされ、それを反映した ruby-build のバージョンがリリースされていました。
Released ruby-build-v20201210 with OpenSSL-1.1.1i.
— Hiroshi SHIBATA (@hsbt) 2020年12月10日
This version supports M1 chip. So, you can build Ruby 2.7.2 and 3.0.0-preview with `arm64` arch. https://t.co/IRTAVaG0Wk
その際にローカルにインストールしている Ruby で使われる OpenSSL のバージョンを最新に更新したので、その方法を書きます。これがベストかわかりませんが自分はこうしたという方法です。
試した環境
MacOS 10.15.7
Ruby は ruby-build + rbenv で管理しています。 今回は Ruby 2.7.2 を使います。
方法
方法は単純でただ Ruby を再インストールしただけです。
まず最初の状態です。以下のようにすることで OpenSSL 1.1.1h
が使われてることが確認できます。
$ ruby -r openssl -e 'p OpenSSL::OPENSSL_LIBRARY_VERSION' "OpenSSL 1.1.1h 22 Sep 2020"
次に最新の ruby-build を取得、さらに更新したい Ruby をアンインストールして再度インストールします。
$ brew upgrade ruby-build $ rbenv uninstall 2.7.2 $ rbenv install 2.7.2
再度確認すると OpenSSL 1.1.1i
(2020/12/10 時点で最新バージョン)が使われています!
$ ruby -r openssl -e 'p OpenSSL::OPENSSL_LIBRARY_VERSION' "OpenSSL 1.1.1i 8 Dec 2020"
他の Ruby バージョンも更新するには、また同じように Ruby を再インストールする必要があると思います。
参考
ターミナルと VS Code から GitHub のリポジトリのページをすぐに開く方法
開発をしていると、PR を開きたかったり PR のレビューをしたいなどで、GitHub のリポジトリのページをブラウザで開きたいことが多々あります。 そんな時にすぐに開くことができる方法を2つ紹介します。
※この記事はMacの開発環境を想定しています。
ターミナルから開く方法
GitHub が公式に開発している gh
コマンドを使うのが便利です。
Mac であれば Homebrew から簡単にインストールして使えます。
$ brew install gh
gh
コマンドには GitHub のページを開くコマンドが提供されています。
cd
で対象のリポジトリのディレクトリに移動して以下のコマンドを実行してください。すると GitHub のリポジトリのページが自動的にブラウザで開きます。
$ gh repo view --web
私は頻繁に使うのでエイリアスに登録しています。
alias repo='gh repo view --web'
gh
にはこれ以外にも便利なコマンドがあるようなので使ってみます。
VS Code から開く方法
拡張機能の GitLens
を使います。 GitLens
はコードの blame を見たりするのに便利で使っているのですが、他の機能もあります。
インストールしたら Command + Shift + p
でコマンドパレットを開いて、GitLens: Open Respository on Remote
のコマンドを検索し実行してください。
するとブラウザが起動し自動的にリポジトリのページが開いてくれます。これを頻繁に使うのであればショートカットも設定するのもよいでしょう。
初めて投稿してみました
初めまして。wai-doiです。
これから技術系のブログを投稿してみようと思います。
よろしくお願いします。