Ruby関連のことを調べてみた2023年02月09日

Ruby関連のことを調べてみた2023年02月09日

seed_fuのseedメソッドの引数を活用すれば、似たデータが重複して新規作成されることもないし、idをわざわざ書く必要もないぞと気づいた

## 困ったこと
Railsのseed_fu、こういう風にidなどprimary keyを書くのを巷でよく見かけます。

“`ruby:db/fixtures/users.rb
User.seed do |s|
s.id = 1 # ←
s.name = “鈴木一朗”
s.email = “ichiro@example.com”
end

User.seed do |s|
s.id = 2 # ←
s.name = “鈴木二郎”
s.email = “jiro@example.com”
end
“`

idなんて自動採番されるんだから、書く必要なくない?ほら、削除してもデータ作れるじゃん!と無邪気にどや顔していたのですが、青二才でした。

確かにデータは作れます。しかしながら、seed_fuがいいのは、2回目以降流す時に、変更点だけを更新してくれるところ。primary keyを指定してあげないと、seed_fuはこれは既にあるデータだと判別できず、新しいデータをcreateしてしまいます。

とほほ。じゃあ、idを書いてあげて、変数をインクリメントしていく

元記事を表示

indexメソッド

# indexメソッド
文字列や配列の中に、指定した文字列が含まれていたとき、その文字列が何番目から配置されているのかを整数の値で返します。

## 例
“`ruby
str.index(検索したい文字列, [検索を開始する位置])
“`

indexメソッドの公式リファレンスはこちら。
https://docs.ruby-lang.org/ja/latest/method/String/i/index.html

# indexメソッドを使ってプログラムを作成します

任意の文字列に”code”が、左から何文字目に出てくるかを返し、その数を出力するメソッドを作りましょう。

呼び出し・出力例は以下のような形で行います。
count_code(“codexxcode”) → 1(ターミナルの返し)
count_code(“aaacodebbb”) → 4(ターミナルの返し)
count_code(“cozexxcode”) → 7(ターミナルの返し)

“`ruby
def count_code(str)
puts (str.index(“code”) + 1)

元記事を表示

Ruby scanメソッド

# scanメソッド
対象の要素から引数で指定した文字列を数え、配列として返します。

“`ruby
def count_hi(str)
puts str.scan(“hi”)
end
# 呼び出し例
count_hi(‘abc hi ho’)
“`

“`ruby
hi
# ターミナル出力
“`

scanの公式リファレンスです。
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html

# scanメソッドを使ってプログラムを作成します

以下条件です。
– 条件1:対象となる文字列の中から、”is”という特定の文字列の数を取得すること
– 条件2:上記で取得した数を出力すること

“`ruby
def count_hi(str)
puts str.scan(“is”).length
end
# 呼び出し例(引数には対象となる文字列を指定します)
count_hi(“This is a pen.”)
“`

“`
2
# ターミナル出力
“`

## 解説
今回は”is”という文字

元記事を表示

Ruby if, elseを使ったプログラム

# if, elseを使ってプログラムを書きます。
あなたは警官です。aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
※問題文で登場したaとb二人の容疑者は、今回実装するpolice_troubleメソッドの引数として取り扱っていきます。

条件は以下の通りです。
– 条件1:第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
– 条件2:第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
– 条件3:第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること

“`ruby
def police_trouble(a, b)
if (a && b) || (!a && !b)
puts “True”
else
puts “False”
end
end
“`

# 解説
この問題は、論理演算子を用いて作成していきます。
下記参考までに。
“`ruby
# aもbもtrueの場合にtrue
a && b

# a

元記事を表示

rendering_optionsが見つからない時の対処方法:Rails 7 + Devise + Turbo

## Rails 7 + Devise + Turboを使うには
Rails 7のアプリでDeviseとTurboを使った時のパッチをいくつかのところで見かけました:

[【2023年版】Turboを有効化したままRails 7.0でDeviseを使う方法](https://qiita.com/jnchito/items/48db78c465493837c41f)
[Devise Auth Setup in Rails 7](https://betterprogramming.pub/devise-auth-setup-in-rails-7-44240aaed4be)
[How to use Devise with Hotwire & Turbo.js Discussion](https://gorails.com/forum/how-to-use-devise-with-hotwire-turbo-js-discussion#forum_post_17983)

こんな感じです:
“`ruby:app/controllers/turbo_devise_controller.rb
c

元記事を表示

初投稿!自己紹介

初めまして!YOSHIKIと申します!
現在オンラインスクールでプログラミングを学んでます。
主にRubyを学んでおります。

勉強する中で発信力の大事さを知り、自分が学んだ事を言語化して投稿して
自分自身の成長に繋げる目的でQiitaを利用させて頂いてます!

またいろいろな方々の投稿も確認しながら知識を得ていけたらなと思っております!

これから宜しくお願いします!!

元記事を表示

ransackのチェックボックスをtrue/falseで返したい

# はじめに
ransackのチェックボックスを使用した時にはまったのでメモを残します

# 前提
以下のadminテーブルに退職者カラムがあります。

“`
class Admin < ApplicationRecord endsuspended :boolean default(FALSE), not null end ``` ・endsuspended:true(退職している) ・endsuspended:false(退職していない) View で下記のようにチェックボックスを実装しようとしています。 チェック有り・・・全員表示 チェック無し・・・退職していない人だけ表示 ※初期表示は、チェック無しの退職していない人だけ表示させたい ``` = search_form_for @search, url: admin_admins_path do |f| = f.check_box :suspended_eq, checked: @suspended, class: "check-box" ``` # はまったところ Rancackでチェックボックスをチェックし

元記事を表示

Rubyのバージョンを管理する方法

# 初めに
今回は、自分が仕事をしてるときに必要だったRubyのバージョン管理方法を紹介してこうと思います
### 本文
まず、バージョン管理ツールの`rbnev`をインストールします
“`terminal: rbenvのインストール
brew install rbenv
“`
次に、特定のRubyバージョンをインストールするときに必要となる`libyaml`をインストールします
“`terminal: libyamlのインストール
brew install libyaml
“`
全て終わったら下記のコマンドで適用されてるバージョンを確認しましょう
“`terminal: rubyのバージョン確認
ruby -v
“`
必要なバージョンではなかった場合は下記のコマンドでインストールすることができます
“`terminal: rubyの欲しいバージョンをインストール
rbenv install 3.2.0
“`
最後にインストールしてきたバージョンを適用させましょう
“`terminal: rubyのバージョン適用
rbenv global 3.2.0
“`

###

元記事を表示

テーブルを統合する

# はじめに
テーブルの統合することがあったので、手順を忘れないように記載します。

# 要件
approachesテーブルをinformationsテーブルへ統合する

# 目次

1. [カラム追加する](#カラム追加)
1. [データをコピーする](#データコピー)
1. [テーブルを削除する](#テーブル削除)



# カラム追加
approachesテーブルにしか存在しないのは以下です。
・mail_address
・facebook
・line

#### マイグレーションファイル作成
マイグレーションファイルを作成して、統合元テーブルにしか存在しないカラムを統合先テーブルに追加する

“`
rails g migration add_columns_to_informations
“`
#### マイグレーションファイル編集

“`
class AddColumnsToInformations < ActiveRecord::Migration[5.2

元記事を表示

Ruby slice!メソッド

# slice!メソッド
配列や文字列から指定した要素を削除し、削除したあとの要素を返します。
「 ! 」の付くメソッドは***破壊的メソッド***と言います。

## 破壊的メソッド
元の配列や文字列そのものを変化させてしまうメソッドのことを破壊的メソッドと言います。
ちなみに、調べてみると「 ! 」が付かない破壊的メソッドもあります。
勉強する必要がありますね!

## slice!メソッドの例

“`ruby
string = “おはようございます!”
string.slice!(2)
puts string
#=> “おはうございます!”
# 2番目の要素の「 よ 」が取り除かれて、返ってきた
“`

# slice!メソッドを使って任意の文字列を部分的に削除するプログラムの作成

条件は以下の通りです。
– 対象となる文字列からn番目の文字を削除すること
– 削除された文字以外の文字列を出力すること

“`ruby
def string(str, n)
str.slice!(n – 1)
puts str
end
# 以下は呼び出し例
string

元記事を表示

irb起動時に表示されるプロンプト(irb(main):0001:0>みたいなやつ)を非表示にする方法

## 環境

ruby version : 3.1.1p18

## 結論から

`irb –noprompt`で起動する

参考:[library irb](https://docs.ruby-lang.org/ja/latest/library/irb.html)

## 調べた経緯

irbを普通に起動すると、`irb(main):0001:0>`のようなプロンプトが表示されます。
ローカルでちょっとrubyを動かしてコードをコピペしたい時、以下のようにプロンプトも一緒についてきてしまって見づらいので非表示にできないかなーと思って調べました。

“`ruby:irb
irb(main):005:1* class Hoge
irb(main):006:2* def fuga
irb(main):007:2* ‘fuga’
irb(main):008:1* end
irb(main):009:0> end
=> :fuga
irb(main):010:0> hoge = Hoge.new
=> #
irb(m

元記事を表示

【備忘録】Ruby 2.7で RubyXLを使っているとFrozenError can’t modify frozen String: “” というエラーが出る

Ruby2.7のバージョンを2.7系に上げたときにRubyXLを使っているファイル内で“`FrozenError can’t modify frozen String: “”“`というエラーが出るようになりました。

#### 結論

rubyXLを3.4.11以上のバージョンに上げることで解消された。

#### 原因
調べてみるとrubyのバージョンを2.7にあげた時に、gemのバージョンが追いついておらず同じエラーが起きたという記事がありました。
Ruby2.7からnil.to_sがfrozen stringを返すようになったことが原因のようです。

以下のcommitで修正されたようなので、バージョン3.4.11以降であれば動くと思います。

https://github.com/weshatheleopard/rubyXL/commit/f0ed6a28dd4f5a1b39e64123be6dbfcdee439145

元記事を表示

PostgreSQLのプライマリーキーはSERIALとUUIDのどっちが速いのか実験してみた

:::note warn
**注意**
この記事の実験は実際の運用を正確に反映していない恐れがあります(コメント欄の @hmatsu47 さんの投稿を参照)。
実務のアプリケーションでは異なる結果になる可能性もあるので、本記事の内容はあまり鵜呑みにせず参考程度に留めておいてください。

※「実務に近い環境で実験してみた」という投稿もお待ちしています!
:::

## はじめに
データベース(この記事ではPostgreSQLを対象とします)の主キーは1,2,3のような連番の整数値を主キーにするSERIALと、”00009236-b73c-4338-8ebd-e1f6c4f4fdd8″のようなランダムな文字列を主キーにするUUIDがあります。

それぞれメリットとデメリットがありますが、パフォーマンスについてはどうでしょうか?なんとなくSERIALの方がシンプルなぶん、速そうなイメージがありますが、実際はどうなのか調べてみました。

## 実行環境

– MacBook Pro 13-inch, M1, 2020
– Memory 16GB
– macOS Ventura

元記事を表示

【初心者向け】Rubyのinitializeメソッド(初期化)とは?

今回は、`initialize` メソッドについてについて解説します。

## initializeメソッドとは?

`initialize` は特殊なメソッドで、インスタンスを初期化したい処理が発生する場合に使います。

そのため、必要がない場合は記載する必要はありません。

では、何が嬉しくなるかということを説明します。

## initializeを定義した場合

まず、下記のサンプルコードを見てください。

“`ruby
class Animals
def initialize(name)
@name =name
end

def hello
“#{@name}が鳴きました”
end
end

animals = Animals.new(‘象’).hello
p animals

#”象が鳴きました”
“`

上記コードで `Animalsクラス` を作成する際に、象を引き渡し `.hello` でインスタンスメソッドを実行します。

そうすると「象が鳴きました」と出力されます。

インスタンス、クラスの概念が分かりきっていない方は

まぁこ

元記事を表示

[Rails]既存カラムのデフォルト値を変更する方法

# 前提
ユーザー(User)テーブルに管理者フラグ(admin_flag)があるとします。
今回はデフォルトをtrueからfalseに変更してみたいと思います。
*今回はboolean型を操作しますが数値/文字列でも同様に変更可能です。

“`
Table name: users

admin_flag :boolean default(TRUE)
“`

# 手順
## マイグレーションファイルを作成
デフォルト値変更のためのmigrationファイルを作成します。
今回はデフォルト値を変更するので
“`Change[カラム名]DefaltTo[テーブル名]“`
というマイグレーションファイル名にしています。

具体的には
“`rails g migration ChangeAdminFlagDefaultToUsers“`
でファイルを作成しました。

## マイグレーションファイルの中身を記述
実際に書くのは1行追加だけになります。
“`ruby
def change
# change_column_default :テーブル名, :カラム名, from:

元記事を表示

[Rails] タグ機能/タグ一覧ページの実装

# はじめに
タグ機能をgemを使わず、実装するための忘備録です。
設計は、中間テーブルを使うToxi法、といわれる形式で作成します。

# 実行環境
– Rails 7.0.4.1
– Ruby 3.0.4
– Devise 4.8.1

# 実装
### 1. アソシエーション
![タグ機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118527/ffe07c55-d7d6-7846-7247-1ba43c8615c7.png)
articlesテーブルとtagsテーブルを多対多でつなげます。
こうすることで、tagの編集をしたいときに、それぞれのarticleを編集する必要がなくなります。

注意する点は、articlesテーブルとtagsテーブルは親子関係にはなっていないことです。
そのため、modelに dependent: :destroyとつけても articleの削除と同時に、tagは削除されません。
>構造を考えれば、当たり前なのですが、articleを削除してもtagが消えず

元記事を表示

テストにおけるリーダブルとDRYの両立(あるいは妥協案)

## Tl;DR
– テストにおいて、可読性は最重要
– 一方でDRYに書かないと保守性が悪い場合もある
– 折衷案として、コメントやインデントを活用するといいかも・・!

## 前提
– 本記事では、言語/テストフレームワークとしてRuby/RSpecを使用します
– あくまで筆者の主観/経験に基づく一意見であることに留意ください

## テストにおいて、可読性は最重要
テストにおいて、可読性は最も重要だと考えます。例えば以下のような関数をテストしたい場合、

“`ruby
# 半角数字7桁の文字列かどうかを判定する
def self.valid_postcode?(postcode)
return false unless postcode.is_a?(String)

/\A\d{7}\z/.match?(postcode)
end
“`

以下のようなテストコードはDRYですが、一見した時に意図が読み取りづらいです。

“`ruby
describe ‘.valid_postcode?’do
[
[‘1234567’, true],

元記事を表示

Rubyで同じ要素をカウントするメソッド

# 概要
rubyで同じ要素をカウントするプログラムを考えていたときに、リファレンスにあったメソッドについてです。

# tally
はじめは、以下のようなプログラムを考えていました。

“`
fruits = [“apple”, “grape”, “orange”, “banana”, “orange”, “apple”]

# 重複をなくす
p fruits_uniq = fruits.uniq

# [“apple”, “grape”, “orange”, “banana”]

# 種類ごとにカウントする
fruit_list = {}
fruits_uniq.each do |s|
fruit_list[s] = fruits.count(s)
end
p fruit_list

# {“apple”=>2, “grape”=>1, “orange”=>2, “banana”=>1}
“`

これを1行でできるメソッドがtallyメソッドになります。

“`
fruits.tally

# {“apple”=>2, “grape”=>1, “orange”=

元記事を表示

EC2へのdeploy時にmini_racerでエラー

Rubyのバージョンアップ対応でめちゃくちゃはまった・・・
今更ながらRuby2.5.1からひとまず2.7.7(bundler 2.4.6)へ(この後3.2.0にアップデート予定)

開発環境では順調に進むものの、capistranoを使ったdeployがまったくうまくいかない・・・
インフラ系に弱いのでまじで泣きそうだったー

とくにmini_racerとかlibv8-nodeとか、ちょっと調べるといろんな人がはまっているところに同じようにはまりました

“`
01 current directory:
01 /var/www/{appli}/shared/bundle/ruby/2.7.0/gems/mini_racer-0.6.3/ext/mini_racer_extension
01 make “DESTDIR=”
01 compiling mini_racer_extension.cc
01 linking shared-object mini_racer_extension.so
01 g++: エラ

元記事を表示

kaminariでbootstrap4を適応したファイルが作成されない時の対処方法

## 状況

– ruby: 2.4.5
– rails: 5.0.0.1
– kaminari-core-1.2.2

以下のコマンド実行するとエラー文が出る
“`bash
rails g kaminari:views bootstrap4

/usr/local/bundle/gems/kaminari-core-1.2.2/lib/generators/kaminari/views_generator.rb:117:in `get_files_in_master’: private method `open’ called for URI:Module (NoMethodError)
“`

### views_generator.rb 一部抜粋

“`rb:views_generator.rb
module GitHubApiHelper
require ‘open-uri’

def get_files_in_master
master_tree_sha = URI.open(‘https://api.github.com/rep

元記事を表示

OTHERカテゴリの最新記事