- 1. 2つの区間(Range)の重複を判定する方法
- 2. VSCodeでCRubyを開発する
- 3. 【Ruby】.gemspecについて
- 4. Range オブジェクトに minmax を使って多重代入
- 5. 【Ruby on Rails】Rails consoleで特定のレコードのカラムの情報を更新する方法
- 6. Release Please Actionの紹介
- 7. リーダブルRSpec(カスタムマッチャー+RSpec::ContextHelper編)
- 8. RVMでRubyのマルチユーザーインストールを試す
- 9. Array.concat
- 10. 【Ruby】ハッシュについて【初心者向け】
- 11. FizzBuzz問題
- 12. Rails mapメソッドがふんわりしてたので調べてみた
- 13. 【ノート】rbenv
- 14. 【rails6】バッチ処理の際のfind_eachについて備忘録
- 15. 【Ruby 初心者向け 演習問題】配列・範囲とは
- 16. Dockerで何もしていないのにRubyのバージョンが変わった時の対処法
- 17. 【RSpec】createアクションに関するテスト(リクエストスペックでUserモデルとリレーションのあるデータが追加されるかをテストする)
- 18. RailsのDateTime月の相対時間計算における、since関数と四則演算の結果の違いに注意
- 19. FactoryBotをSeedで使う
- 20. 【Rails】ランキング形式で投稿を表示する。(部分的にパーシャルの内容を変更)
2つの区間(Range)の重複を判定する方法
どうも、「病院なび」の開発チームメンバー甘利です。
今日は区間(Rangeクラス)の重なりの判定について説明します。Rangeクラスを利用していると、それらが重なっているか?という判定をしたくなる時があります。
ActiveSupportを利用していれば .cover? メソッドを利用することができますが、
そうじゃない時はどうしたら良いでしょうか。ふたつの閉区間を表すRangeオブジェクトの r1 と r2 があり、
r1, r2 の端をそれぞれ r1_s, r1_e、r2_s r2_e と表すとします。
さて、このふたつのRangeが重なっていることを判別するにはどうしたら良いでしょうか。# 順当に考えてみる
ふたつのRangeの区間が重なっているとはどういうことかを書き出してみますと、
以下のいずれかが成り立つとき、とうことになります。
1. r1 の範囲に r2_s が含まれている
1. r1 の範囲に r2_e が含まれている
1. r2 の範囲に r1_s が含まれている
1. r2 の範囲に r1_e が含まれているこれをRubyのコードでそのまま書くと
VSCodeでCRubyを開発する
# Cの設定
* Settings (Workspace) > Extensions > Makefile Tools > Makefile > Make Directory: out-of-place ビルドのディレクトリを指定する# Rustの設定
Cargo.tomlの場所を設定する設定があるか? (未調査)
【Ruby】.gemspecについて
## `.gemspec`について
“`sample_gem.gemspec
Gem::Specification.new do |spec|
spec.name = “sample_gem”
spec.version = “Gemのバージョン”
spec.authors = [“作成者”]
spec.email = [“メールアドレス”]
spec.homepage = “ホームページ”
spec.summary = “要約”
spec.license = “ライセンス”spec.metadata = {
“bug_tracker_uri” => “https://github.com/username/sample_gem/issues”,
“documentation_uri” => “https://github.com/username/sample_gem”,
“label” => “Gem名”,
“rubygems_mfa_required” => “真偽値”,
“source_code_uri
Range オブジェクトに minmax を使って多重代入
例えば、2022年現在のお盆の期間を Range オブジェクトで保持しているようなケースを考える。
“`ruby
require ‘date’# 2022年のお盆の期間
THIS_YEAR_OBON_RANGE = (Date.parse(‘2022-08-13’)..Date.parse(‘2022-08-16’))
“`これを元に、お盆の開始日と終了日をそれぞれ変数に格納しようと思った場合、素直に書くとこうなる。
“`ruby
from = THIS_YEAR_OBON_RANGE.first
to = THIS_YEAR_OBON_RANGE.last
“`これを1行で書きたいとき、`minmax` を使うと多重代入で済むので便利だと気づいた。
“`ruby
from, to = THIS_YEAR_OBON_RANGE.minmax
“`若干トリッキーではあるので、他に良い書き方があれば知りたい。
なお、この書き換えが通用するのは `min` で始端、`max` で終端が取得できる場合のみであって、一般には等価な書き換えではないことに注意。以下
【Ruby on Rails】Rails consoleで特定のレコードのカラムの情報を更新する方法
## Rails console
“`
pry(main)> User.first.update_column(:name, “ごりら”)
“`
これは、Userテーブルの一番目のテーブルのnameカラムの内容を“ごりら“に変更したいとき## SQL文
“`
SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
UPDATE `users` SET `users`.`name` = ‘ごりら’ WHERE `users`.`id` = 1
“`こんな感じ。
Release Please Actionの紹介
[RSpec::ContextHelper](https://github.com/masaakiaoyagi/rspec-context_helper.rb)という小さなgemのリリースに[Release Please Action](https://github.com/google-github-actions/release-please-action)を使ってみたのですが、便利だったので紹介します
—
## これは何?
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)に従ったコミットメッセージを付けることでリリースの自動化をするもの—
## 何してくれるの?
以下のようなことが出来そうです
* [バージョン](https://github.com/masaakiaoyagi/rspec-context_helper.rb/pull/24/files#diff-fc01d50d6c08cd5b55f1596f331d2cd2c25bd19db0bb7cb72ee2e0476
リーダブルRSpec(カスタムマッチャー+RSpec::ContextHelper編)
## 読みやすいRSpec書いていますか?
—
### 読みやすいRSpecって何?「簡潔でテストケースを見てテスト内容が理解しやすいもの」と考えています
ここでのテストケースとは、it/exampleブロックのことを指しています—
## 例題
例えば、Rails製REST APIのRequest Specを書くことを考えてみます
コードは正しいか確認していないので、多少間違っていてもお許しください?### 前提
* APIはたくさんある
* 良くないけど、クエリパラメータのチェックをcontrollerでしているため、テストはRequest Specで行う—
### APIの共通仕様
* Server Errorを除き、HTTPステータスコードは必ず200で返す
* HTTPレスポンスボディはJSON形式で返す
* 成功時のレスポンス
“`json
{ “status”: 200, “message”: “Succeed”, “data”: … }
“`
* 未認証時のレスポンス
“`json
{
RVMでRubyのマルチユーザーインストールを試す
## これはなに
`rbenv`を使ってRubyマルチユーザーで使えるようにインストールしようと思って調べてみたところ、`rbenv`だと少し面倒そうだった。
その最中に`RVM`なるものを見つけて、楽にインストールできたのでインストール手順を書いておく。## rbenvでマルチユーザーインストールする場合
以下の記事などのように、
https://qiita.com/dawn_628/items/2fb2be24e7ba08d9a5fa
– `/usr/local/`などにrbenvを配置
– sudoerもrbenvを呼べるようにPATHを通す
– `RBENV_ROOT`環境変数を設定、sudo時に渡すようにするをしなければならない。
どうやってマルチユーザーで使えるようにしてるか後から触る時に忘れそうだなと思って、以下の記事を読んでいたら、
https://komiyak.hatenablog.jp/entry/20150603/1433364444
> rbenv と同じバージョン管理ツールの RVM には、「Multi-User installatio
Array.concat
RubyのArray.concatは破壊的で、
JavaScriptのArray.concatは非破壊的https://docs.ruby-lang.org/ja/latest/method/Array/i/concat.html
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
【Ruby】ハッシュについて【初心者向け】
## ハッシュとは?
:::note info
キーと値の組み合わせでデータを管理するオブジェクトです。`イメージ`
{ キー1: 値1, キー2: 値2, キー3: 値3 }
:::
## 配列との違いは?
配列が要素を指定するのには、「0」から始まるインデックス番号を使用します。
それに対し、ハッシュは「キー」と呼ばれる任意の文字列を使用し、「バリュー」と呼ばれる要素を指定します。
“`ruby:hash.rb
about_taro = { name: “suzuki taro”, age: 30, like: “apple”, hobby: “swimming” }
puts about_taro[:name]
#==> suzuki taro
“`## 配列ではなくハッシュを使うメリットは?
**1. コードの可読性が高い。**
ハッシュは任意の文字列であるキーとの組み合わせにより、バリューがどういったものなのかが分かりやすいです。
“`ruby:hash.rb
#ハッシュの場合 キーにより、バリューが何の値段なのか分かります
FizzBuzz問題
エンジニアのコーディングテストかなんかで用いられるとかで有名なFizzBuzzをやってみた。
# 問題
1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。雛形
“` question.rb
def fizz_buzz
# ここに処理を書き加えてください
endfizz_buzz
“`# 問題文を分けて考えてみる
まず最初に1から100までの数字を出力することが必要。
while文で100になるまで出力するよう繰り返し処理を行う。
“`question.rbdef fizz_buzz
num = 1
while (num <= 100) do puts num num = num + 1 end end fizz_buzz ``` 次に倍数式。今回はそれぞれ15の倍数でFizzBuzz、5の倍数でBuzz、3の倍数でFizzとあったがそれぞれ条件分岐で記述。
Rails mapメソッドがふんわりしてたので調べてみた
### はじめに
現場に入るとコードの至るところに扱い慣れていないメソッドが登場します。
これまでの記事でもpluckメソッドを紹介しました。
https://qiita.com/tatsu0209/items/61bdbe46216991aeb8d3
でも、現場でいちばん目にしたメソッドってなんだろうか・・・
そう、それはおそらくmapメソッドだ。
なんとなくわかったふりでふんわりと読んでいたので色々と調べてみました。
その結果を備忘録として残したいと思います。
もしもおかしな点やお気づきの点がありましたらご指摘いただけると大変ありがたいです。### 環境(自分のPC)
Ruby 2.7.1
Rails 6.0.5### mapメソッドとは
公式ドキュメントでは次のように説明されています。
>各要素に対してブロックを評価した結果を全て含む配列を返します。ブロックを省略した場合は Enumerator を返します。簡単に言うと、要素を順番に取ってきて、指定した処理をしてくれるメソッドです。
記述方法としては次のようになります。
~~~ ruby
配列.map { |変数|
【ノート】rbenv
# about
rubyのバージョン管理# コマンド
$ rbenv versions
$ rbenv local 3.1.1
$
【rails6】バッチ処理の際のfind_eachについて備忘録
今回は、railsのバッチ処理でループ処理を実行する際には“find_each“を使用することをおすすめされたので備忘録として書き留めておきます。
## find_eachとは
“find_each“とは、配列に対してループ処理を行うeachメソッドの派生版であり、取得するレコードを小分けにしてループ処理を行うことができます。
例えば、articlesテーブルに10,000個のレコードがあるとします。
“`ruby
articles = Article.all
articles.find_each(batch_size: 100) do |article|
article.update!(title: ‘article_test’)
end
“`
のように書くことによって、「articlesテーブルのtitleカラムの中身を’article_title’にする」というループ処理を、10,000個のレコードを100個ずつ取得し100回に分けて実行することができます。## find_eachとeachの違い
二つのメソッドの違いは単純で、
“each“=> 配列
【Ruby 初心者向け 演習問題】配列・範囲とは
## 対象の読者
独学で5年ほどpython/VBAを学習・開発した筆者の経験から初心者向けに・配列の抑えるポイント
・配列を使えるくらいに理解してるかという点について解説していきます!
# 配列とはなんぞや
:::note
【ここだけ抑えれば配列は完璧です!】
数字の振ってある箱のイメージ–>
そして、<配列の入っている変数名[箱の番号]>とすると
箱の中に入っている要素が取り出せる:::
![Screen Shot 2022-07-26 at 16.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646082/e89e24c8-9d9b-4f32-e89d-1a96800773ee.png)
“`ruby:Q1-usagiを出力させてみよう!
arr = [‘niwatori’,’neko’,’usagi’]
“`Q1解答
arr[2]
## どういう時に使うの?
::
Dockerで何もしていないのにRubyのバージョンが変わった時の対処法
## エラー内容
突然、Dockerで環境構築していたアプリで、
“`terminal:terminal
Your Ruby version is 2.7.4, but your Gemfile specified 3.1.2
“`
となり、何もできなくなった。。。## 解決方法
vscodeの拡張機能「Remote – Containers」を使っていたので、そこの「Rebuild Container」をクリック!
[![Image from Gyazo](https://i.gyazo.com/1110a3c08a1bff63884324bfcc1c49ef.png)](https://gyazo.com/1110a3c08a1bff63884324bfcc1c49ef)
ビルドされるのを待って、再度試すとエラー解決していました?正常にビルドされていなかったことが原因っぽいです。
【RSpec】createアクションに関するテスト(リクエストスペックでUserモデルとリレーションのあるデータが追加されるかをテストする)
# 前提
表を作成するアプリをRailsを使って作成しています。
作成した表は、作成者のみが閲覧・編集・削除できるようにしたいと思っています。# やりたいこと
createアクションに関するリクエストスペックを書く。# 書いたコード
“`ruby:spec/requests/tables_controller_spec.rb
describe”#create”do
context “as an authorized user” do
before do
@user = FactoryBot.create(:user)
endit “adds a table” do
table_params = FactoryBot.attributes_for(:table)
sign_in @user
expect {
post tables_path, params: { table: table_params }
}.to change(@user.tables, :count)
RailsのDateTime月の相対時間計算における、since関数と四則演算の結果の違いに注意
# 2022/07/27追記
@koki_73 様からコメントをいただき、DateTimeクラスは非推奨になっているようです。
結論として、DateTimeは使わないようにするというのが正しい対処です。
@koki_73 様ありがとうございます!!# 結論
**DateTime**におけるsince関数は現在の日付に **30日加算しているだけ** です。例えば、1月31日の1か月後を求める場合以下のような違いがあります。
| 方法 | 結果 |
| —- | —- |
| .since(1.month) | **3月2日** |
| + 1.month | 2月28日 |
| next_month | 2月28日 |
| months_since | 2月28日 |# 注意
これはDateTimeの場合だけです。Dateはすべて2月28日になります。# プログラム例
“`ruby:irbの結果
# DateTimeクラスの場合はsince関数だけ結果が違います
a = DateTime.new(2022,1,31) # => Mon, 31 Jan 2022
FactoryBotをSeedで使う
# 結論
`require ‘factory_bot_rails’`をseedファイルの上部に記載することでFactoryBotが使えます。“`ruby:seedファイル
# rquireが重要!!!わすれないで!!
require ‘factory_bot_rails’# 例1:1個データを作る
FactoryBot.create(:parent, name: ‘親1’)
# 例2:いっぱいデータ作る
FactoryBot.create_list(:child, 5, name: ‘子’)
# 例3:戻り値を使って作ったデータを取得する & データをセットする
parent = FactoryBot.create(:parent, name: ‘親1’)
FactoryBot.create_list(:child, 5, name: ‘子’, parent: parent)
“`# 事前準備
## Gem
Gemの`factory_bot_rails`が必要です。Gemfileに追記しましょう。## Factory
上記例の場合、このような感じのFactoryが必
【Rails】ランキング形式で投稿を表示する。(部分的にパーシャルの内容を変更)
# はじめに
投稿をランキング形式で表示する際に、テンプレートは流用しつつ、第1位、第2位、、、のような数字部分を変えていく動作を加える。# 前提
下記は作成済み
ユーザーテーブル
マイクロポストテーブル
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |# 基本
ただ投稿内容を繰り返し表示していくには、下記のコードでOK。
“`言語名:app/views/microposts/index.html.erb
<%= render @microposts %>
# => <%= @microposts.each do |micropost|%>
# 第○位
# <%= render partial: 'microposts/micropost', locals: