Ruby関連のことを調べてみた2022年10月03日

Ruby関連のことを調べてみた2022年10月03日
目次

【Ruby】麻雀の点棒を値オブジェクトにしてみた?️

## はじめに
この記事は、麻雀大好きな新米エンジニアが見よう見まねで点棒(麻雀における通貨みたいなもの)を値オブジェクトにしてみたという記事です。暇つぶし程度に読んでもらえたら嬉しいです。
まず簡単に「そもそも値オブジェクトって?」という話をしてから、実際に自分が書いてみた麻雀の点棒オブジェクトを紹介したいと思います。
(※ **麻雀への知識がある前提で書かれた記事です**。何もわからないという方は、「値オブジェクトとは」の項目だけ読むことをお勧めします。)
## 値オブジェクトとは
値オブジェクトとは、**値をクラスとして表現する設計パターンのこと**です。
より詳しく言えば、アプリケーションで頻繁に使われる金額や日付、電話番号といった値をクラスとして扱い、**各値の正常性を初期化段階で担保しながら値そのものとその振る舞いをまとめて管理すること**です。

例えば金額を単なるint型の変数として扱った場合、金額用の変数に負の値が入力されてしまったり、「販売数」など別のint型を金額用の変数に加算してしまうといったミスが起こり得ますが、金額を値オブジェクト化することでこのようなミスを

元記事を表示

【Rails】HerokuからSlack APIにアクセスするとSSL_CTX_load_verify_file: system libというエラーが起きる場合の対処法

## 発生した問題
ローカルでは問題なく動いていたRailsアプリをHerokuにデプロイすると、Slack APIにアクセスするタイミングで以下のようなエラーが発生しました。

“`
ActionView::Template::Error (SSL_CTX_load_verify_file: system lib):
1: channels = slack_client.channels
“`

このエラーが発生した環境は以下のとおりです。

– Ruby 3.1.2
– Rails 7.0.4
– slack-ruby-client 1.1.0
– heroku-22 stack

## 原因

下記のredditにほぼ同じ現象が載っていました。

[Having issues installing Ruby : ruby](https://www.reddit.com/r/ruby/comments/un9rn1/comment/ifqidwl/)

> Hey OP: I’m running into the same `SSL_CTX_load_verify_fi

元記事を表示

引数の数が不定なメソッドの書き方

## 引数の数が不定なメソッドの書き方
メソッドの定義時の引数に 「*変数名」 で定義し、メソッド実行後は、与えられた引数をまとめて「配列」として出力することができる。
書き方は下記の通り。
“`
(fooメソッドを定義)
def foo(*args)
args
end

p foo(1, 2, 3) #=> [1, 2, 3]
“`
また、設定した引数の数でない時にメソッドを実行した時は下記のようになる。
“`
(Methメソッドに通常の引数と引数の数が不定な引数を設定し、値を配列で返す処理を設定)
def meth (arg, *args)
[arg, args]
end

(メソッド実行)
p meth(1) #=> [1, []] (*argsの方には引数を入れメソッドを実行していないので、[]が出力される)

p meth(1, 2, 3) #=> [1, [2, 3]] (最初の1つ目の引数は、argへ、残りの引数は*argsの方に「配列」として出力される)
“`
*また、この時p meth(1, 2, 3).flatte

元記事を表示

Rails7 APIモード device エラー「verify_authenticity_token has not been define」

# 結論
ApplicationControllerで継承元をAPIからBaseに変更する。
“`ruby
class ApplicationController < ActionController::Base include DeviseTokenAuth::Concerns::SetUserByToken skip_before_action :verify_authenticity_token helper_method :current_user, :user_signed_in? end ```

元記事を表示

docker-compose up -d実行時にエラー発生 “ERROR: In file ‘./docker-compose.yml’, volume must be a mapping, not a string.”

こんにちは!ムーさんです!
Docker,Vagrantの学習をメインに続けています。その過程で、DockerfileをビルドしてからRuby,Postgresqlのイメージをpullしてきて簡易的なwebサイトの構築を実施していますが、コンテナが立ち上がらないエラーが発生しました…(泣)

# 1.エラー
Dockerfileをビルドさせた後に、docker-compose.ymlファイルを作成してdocker-compose up -dをしたら下記のエラーが発生しました。
““
$ docker-compose up -d
ERROR: In file ‘./docker-compose.yml’, volume must be a mapping, not a string.

““

# 2.原因
これは、間違いなくdocker-compose.ymlファイルの記述が間違ってますね!でも、どこが間違っているのでしょうか?
“volume must be a mapping”と出力されているので、おそらくホストとコンテナをマウントさせる記述のところですかね?

“`

元記事を表示

Loggerライブラリを使用して一定期間ごとにログファイルを記録したい

# 概要
一定の期間ごとにログファイルをローテートする場合には、
引数でローテートする期間を指定する。
常にログを確認する場合一つのログファイルに書き込まれると確認が大変なため期間でログを管理すると良いと感じた。

“`ruby
require ‘logger’
logger = Logger.new(‘foo.log’, ‘daily’) #日ごとのログ
logger = Logger.new(‘foo.log’, ‘weekly’) #週ごとのログ
logger = Logger.new(‘foo.log’, ‘monthly’) #月ごとのログ
“`

# 参考
https://docs.ruby-lang.org/ja/latest/library/logger.html

元記事を表示

groupメソッドの応用(関連先テーブルのデータをグループ化して表示する方法)

# groupメソッドとは?

指定したカラムの各値ごとにグループ化するメソッド。

下記のテーブルから、各ownerのcatの数のデータを抽出してみる。

![20221002_ownersテーブルの画像(sex,incomeカラムとレコード数を追加).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/e9612fcb-30c4-4d06-89a9-dc456f8cd5e6.png)

![20221002_catsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/124c390f-0e08-8419-e6b4-cacd87ec2dcd.png)

(catsテーブルからowner_idごとにグループ化し、ownerごとに何匹ネコを飼っているか数え上げる)
“`
irb(main):045:0> Cat.group(:owner_id).count
(0.2ms

元記事を表示

to_sqlメソッドでActiveRecord実行時のSQLを確認

## 1. `to_sql`を使用し、ActiveRecordのクエリを出力

“`rb:sample.rb
target_members = Member.joins(:positions).where(positions: { position_status: 5 })
puts target_members.to_sql
“`

– RSpecで任意のテストを実行すると、`putsメソッド`を使っているため標準出力に出力される

“`terminal:Run
SELECT “members”.* FROM “members” INNER JOIN “positions” ON “positions”.”member_id” = “members”.”id” WHERE “positions”.”position_status” = 5
“`

:::note warn
`pメソッド`で出力している際は出力結果に`”`(ダブルクォーテーション)のみならず`\`(バックスラッシュ)も含まれる
:::

## 2. エディタなどで置換
– 私はいつも`Visual Studio

元記事を表示

pluckメソッドの使い方と注意点

## pluckメソッド
引数に指定したカラムの値を配列で返してくれるメソッド。
使い方は下記の通り。

モデル名.pluck(:カラム名)

実際に使用してみる。
![20221001_ownersテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/efa06978-4044-0920-470e-44eae6241826.png)

(nameカラムを指定したpluckメソッドを実行し、nameカラムの値を配列で取得する)

“`
irb(main):011:0> Owner.pluck(:name)
(0.2ms) SELECT “owners”.”name” FROM “owners”
=> [“田中”, “伊藤”, “高橋”, “加藤”]
“`

また、引数を「複数」設定することで、二次元配列で値を取得することができる。

例えば、テーブルが下記の内容であったとする。

![20221001_ownersテーブルとcatsテーブルの画像.png](h

元記事を表示

特定の文字列の数をカウントする方法

# 概要
特定の文字列の数をカウントする方法を備忘録として残します。

# はじめに
scanメソッドとlengthメソッドを活用します。まずは復習から。

## scanメソッドとは?
対象の文字列の中に特定の文字列の検索結果を配列として返します。
“`ruby
“foobarbazfoobarbaz”.scan(“ba”)
# => [“ba”, “ba”, “ba”, “ba”]
“`

## lengthメソッドとは?
文字列の文字数を返します。
“`ruby
def count_hi(str)
puts str.length
end
count_hi(‘abc hi ho’) #=> 9
“`
ん??それだと、今回の文字列の数をカウントするには使えない?

# 文字列の数(要素数)をカウントするには?
lengthメソッドにはstringクラスの他にも、arrayクラスにもあります。
上記のカウント方法は、stringクラスで取得したものです。
今回はarrayクラスを活用して要素数を取得します。
“`ruby
array = [“abc hi ho”,”hi

元記事を表示

dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)の対応方法について

## dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)について

dependent: :destroyオプションは、親モデルのデータが削除されるときにそれに関連していた子モデルのデータも削除することができるオプション。
このオプションを設定しないと、親モデルのテーブルのデータを削除するときにエラーになる。

![20221001_ownersテーブルとcatsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/85114159-d1f8-51bb-2c1d-ea53bba26c5f.png)

上記のようなテーブルがあり、ownersテーブルのid=3 高橋さんを削除すべく以下のコマンドを実行。

“`ruby:rails c コマンドの実行
irb(main):002:0> Owne

元記事を表示

Rails4.2でArelを用いてORクエリを作成

:::note warn
Rails4.2からActiveRecordがSQLのキャッシュのためにSQLのローカル変数 (`$1`など) を使うようになり、ActiveRecordで生成したActiveRecord::RelationをそのままORで繋げられなくなってしまった。
:::

– 解決時に勉強になったので備忘録として記載
– 直接SQLを書けば早い話だが、そういう訳にもいかなかったので最低限はArelで補わなければいけないという状況下

:::note
前提として、「なるべくArelを使わないようにして実装する」ことは心掛ける
:::
→ 参考:[Arelでクエリを書くのはやめた方が良い5つの理由](https://qiita.com/jnchito/items/630b9f038c87298b5756)

## モデル

– aa_sample
– bb_sample
– cc_sample
– dd_sample

“`rb:関連付け
aa_samples has_many bb_samples
aa_samples has_many cc_samples
a

元記事を表示

オリジナルアプリをIaC化+データ移行

# はじめに
以前、以下のインフラ構成で[オリジナルアプリをデプロイしました](https://qiita.com/Unimaru/items/66a01ad5dab54e66ff47)が、いくつか改善などをしたく、今回別途インフラ構成をIaCで作成の上、移行をします。(Freenomで別の独自ドメインを取得)

【旧構成】
![スクリーンショット 2022-09-25 10.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/438fac02-196b-0b14-a50e-7b05fd973654.png)

【新構成】
![スクリーンショット 2022-09-25 14.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a9e953a9-be23-8d41-7eff-de6b56293c10.png)

### 変更点
* スマホの買い替え/MFA関連により、AWSアカ

元記事を表示

downcaseメソッドとlengthメソッドを使って2つの文字列の末尾が一致しているか判断するプログラム

今日も学んだことを忘れないためにメモします

## downcaseメソッド とは
文字列に含まれる大文字を小文字に変換したいときに使用するメソッド。
“`
array = “Hiabc”
puts array.downcase

=> “hiabc”
“`
他にも
・文字列に含まれる小文字を大文字に変換するupcaseメソッド
・文字列に含まれる小文字を大文字に、大文字を小文字に変換するswapcaseメソッド
・先頭の小文字を大文字に,他の文字を小文字にするcapitalizeメソッド
がある

## lengthメソッドとは
「文字列の長さ(文字の数)」と「配列の要素の数」を 調べるためのメソッド。
“`
str = “abcdefg”
puts str.length

=> 7

data = [1,2,3,4,5,6,7,8,9]
puts data.length

=> 9
“`

## プログラム内容
・引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
・上記を満たせていない場合は、Falseを出力する
・入力

元記事を表示

Qiita初投稿

未経験30歳からのプログラミング学習の記録をしていきます。
プログラミングスクールにて現在、RubyとRuby on Railsを中心に学習中です。
アウトプット用に記事をこれから書いていきたいと思います。

元記事を表示

Remember_meのチェックをしたときにだけ、指定のURLに遷移しないようにする方法

Railsのログイン機能(Device)で、remember_meのチェックをしたときにだけログイン状態が継続するような仕組みを作るために苦戦したので備忘。

やりたいこと
 remember_meのチェックをしたとき、ログインのURLに遷移しないようにする。(ログインユーザの画面に遷移するようにする)
 チェックをしなければ、ログインのURLに遷移するようにする。

やったこと
 Userモデルにremember_meを有効にするコードを追加、更に、remember関数とそれに付随する関数を追加
“`/rails_projects/dev_obento_01/app/models/user.rb
class User < ActiveRecord::Base attr_accessor :remember_token # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable

元記事を表示

Python,Ruby,PHP,Java,JavaScript,PerlのPDF作成の比較

Qiita > プログラミング言語の比較

Python,Ruby,PHP,Java,JavaScript,PerlのPDF作成の比較

# Python

https://qiita.com/godan09/items/13866970972bf3a1c243

# Ruby

https://qiita.com/inoue9951/items/4498e5d130702d884352

# PHP

https://qiita.com/one_punch_man/items/bf140d4300195577dd3d

# Java

https://qiita.com/iceblue/items/a059c99ef1c17226a02a

# JavaScript

https://qiita.com/shuhei_sakiyama/items/ef68d49b7199d50a853b

# Perl

https://perlzemi.c

元記事を表示

Ruby問題 配列の並び替え

(1) 配列の並び替え

“`
【Q】 数字の配列を、偶数はそのままの位置で、奇数のみを昇順に並び替えなさい。

例)
[7, 1] => [1, 7]
[5, 8, 6, 3, 4] => [3, 8, 6, 5, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] => [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]
“`

私の回答

“`ruby
def sort_array(array)
oddsArr = array.select {|n| n.odd? }.sort
array.map {|n| n.even? ? n : oddsArr.shift }
end
“`

1) 配列の中から奇数のみを取り出したいので、selectメソッドを使いました。
sortメソッドで昇降順に並び替えて、新しい配列に入れます。

2) 元の配列を三項演算子を使って、並び替えます。
`n.even?` 偶数であるかどうかを判断
YES => そのまま配列に入れる
NO => 奇数なので、`oddsArr`からshiftメソッド

元記事を表示

asdfでruby2.7.6が見つからない件

# はじめに
コロナにかかってしまった筆者です。高熱は3日続き、微熱が1週間下がらず、半年前から計画していた旅行には行けず、悲しい思いをしました。
気をつけてはいたのですが、皆様もどうぞお身体にはお気をつけくださいませ:pray:

さて、今回は新規で参画するプロジェクトのGitリポジトリをクローンして、bundle installした際に、Gemfileに記載のRubyのバージョンが違うと怒られました。

↓こんな感じですね。
“`console
> bundle install
Your Ruby version is 2.6.6, but your Gemfile specified 2.7.6
“`

asdfでバージョン管理しているので、早速インストールしようとすると、ないと言われてしまいました。

“`console
> asdf install ruby 2.7.6
Version not found
“`

そして、確かにないですねー。。
“`console
> asdf list all ruby | grep 2.7
1.8.6-p287
2.0.0-p2

元記事を表示

【Laravel / Rails】bulk insertについてまとめ

一度に複数のデータを1回のクエリでインサートしたいとき(bulk insert)、insert

## PHP/Laravel

クエリビルダの“`insert“`メソッド

“`php
DB::table(‘users’)->insert([
[‘email’ => ‘picard@example.com’, ‘votes’ => 0],
[‘email’ => ‘janeway@example.com’, ‘votes’ => 0],
]);
“`
https://readouble.com/laravel/9.x/ja/queries.html

先輩エンジニアに聞いたところ、「bulk insertは使うとしたら100万件くらいのデータ量の場合だが極力使わないほうがいい」とのこと。
今回のプロジェクトではデータ量がそこまで大量ではなかったため、bulk insertは結局使わないことにした。
下記記事も参考になった。

https://zenn.dev/naoki_oshiumi/articles/648a00bcd4d209

ただ、調べるとLar

元記事を表示

OTHERカテゴリの最新記事