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

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

Python,Ruby,PHP,Java,JavaScript,Perlのオブジェクト指向プログラミングの比較

Python JavaScript PHP Java Ruby

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

Python,Ruby,PHP,Java,JavaScript,Perlのオブジェクト指向プログラミングの比較

# Python

https://qiita.com/kaitolucifer/items/926ed9bc08426ad8e835

# Ruby

https://qiita.com/shogo-1988/items/e749208c0733bbe025c0

# PHP

https://qiita.com/mpyw/items/41230bec5c02142ae691

# Java

https://qiita.com/nao0725/items/aba8126c50bf85543c78

# JavaScript

https://qiita.com/shotets/items/e4b2ca36f5cbdc39

元記事を表示

同じ数値が2つ以上含まれている場合、その数値は合計しないプログラム

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

## プログラムの内容
・配列に格納された数値の合計値を算出する
・ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

## 記述内容
“`
def lone_sum(ary)

uniq_nums = []
ary.each do |num|
count = 0
ary.each do |i|
if num == i
count += 1
end
end
if count < 2 uniq_nums << num end end sum = 0 uniq_nums.each do |unique_num| sum += unique_num end puts sum end lone_sum([1, 2, 3]) lone_sum([3, 2, 3]) lone_sum([3, 3, 3]) => 6
=> 2
=> 0
“`
uniq_nums = [] は重複していな

元記事を表示

Select2の代替にTomSelectを使ってみる

## 概要
インクリメンタルでドロップダウンの選択肢を絞り込める[select2-rails](https://github.com/argerim/select2-rails)のgemはとても便利なんだけど、jQueryに依存しているので、Rails 7 + StimulusなどのjQueryを使わないモダンな環境では使用をためらってしまうかと思います。

![スクリーンショット 2022-10-03 19.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176427/4514fe7a-5489-2f75-7401-378a01879d7f.png “Select2”)

Select2の代わりに使える[Tom Select](https://github.com/orchidjs/tom-select/)がSelect2同様に簡単で便利だったので紹介します。

## 環境
– Rails 7.0.3
– stimulus-rails
– jsbundling-rails(importmap

元記事を表示

初心者エンジニアによる備忘録 環境構築編

 今日は環境構築について書いていこうと思います。環境構築とは、コーディングを行う際に必要な環境を整えることです。
 いろいろな方法があるかと思いますが、私はVSCodeを使用しています。VSCodeはマイクロソフトが開発した大変便利なテキストエディタです。このテキストエディタに必要な情報を書いていきます。
https://code.visualstudio.com/
 このページからダウンロードできます。私はMacを使用していますが、Windowsでも問題なく使用できると思います。
 ダウンロードが終わったら、VSCodeを使用するにあたって便利なツールをとりこんでいきます。この便利なツールのことを拡張機能といいます。
 拡張機能はVSCode上で取得することができます。私が取得したものは、
・Japanese Language Pack For Visual Studio Code
 日本語表記にしてくれます。
・HTML Snippets
 HTMLタグ、CSSの入力を補完してくれます(めっちゃ便利)。
・Ruby
 Rubyの構文をチェックして間違ったところがあれば修正してくれま

元記事を表示

【Rails】重複処理防止機能の実装例

# 同時に処理が走ってほしくないメソッド

“`ruby: Controller
def foo
AggregateTablesService.new.call # 数十万行のレコードの集計を行い、別のテーブルに集計を保存するサービス
@something = CreateGraph.new.call # 集計結果からグラフを生み出しキャッシュに保存するサービス。キャッシュがあればそれを読み込む
end
“`

“`ruby: Batch(毎日深夜に回る)
def exec
AggregateTablesService.new.call
CreateGraph.new.call
end
“`

大量かつ複雑なレコードを扱うにあたって、1)一旦それらを扱いやすいように&処理を高速化するために集計テーブルにまとめる、2)その集計データを使ってグラフを作るという処理を前提におきます。

まず、何度もメソッドが走ることに対しては、「レコードやキャッシュがあればreturnで処理を抜ける」という方法で対策することができるでしょう。

“`ruby: 集計サービス
class

元記事を表示

Rails 検索機能 数値

Railsで数値を検索する機能を作る機会があったので
メモとして残しておきます!

# 目次

1. [今回作るもの](#今回作るもの)
1. [Viewの作成](#viewの作成)
1. [Controllerの編集](#controllerの編集)
1. [入力フィールドをSelectで実装](#入力フィールドをselectで実装)

イメージが沸くように見た目(View)から作っていきます?

# 今回作るもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/5b278645-4cb5-0158-0de7-360293843693.png)
上記の画像のように、投稿内容や投稿タイトルに関する文字列検索機能とは
また別に金額に関して、最大値と最小値を入力して検索をかけます!
[select_tag](https://railsdoc.com/page/select_tag)でわかりやすく範囲にしても良さそうですね!

# Viewの作成
検索機能に該当する部分はこんな感

元記事を表示

【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を書けば早い話だが、生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
aa_sa

元記事を表示

オリジナルアプリを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を出力する
・入力

元記事を表示

OTHERカテゴリの最新記事