Ruby関連のことを調べてみた

Ruby関連のことを調べてみた
目次

associationをキャッシュした場合の速度

## はじめに
N+1はパフォーマンスに影響することは知っていると思います。
ただ、パフォーマンスに影響するということはわかっても具体的にどれくらいの差があるのかを数値で見る機会は、なかなかったので、キャッシュしないものとキャッシュするものを比較してみたいと思います。

## テーブル関係
親usersテーブル、子postsテーブルを用意します。
“`rb:app/models/user.rb
class User < ApplicationRecord has_many :posts, dependent: :destroy end ``` ```rb:app/models/post.rb class Post < ApplicationRecord belongs_to :user end ``` ## seedの用意 以下のようなseedデータを用意します。データの件数は1000件です。 ```rb:db/seeds.rb 1000.times do |n| user = User.create!( name: "山田 太郎", email: "s

元記事を表示

【Rails】ArgumentError (Unrecognized status code :request_entity_too_large)

## はじめに
Rails7にアップデート中、request_entity_too_largeを使用している部分でエラーが発生したので、解消方法をまとめていきます。

## 問題
コード
“`ruby
render body: nil, status: :request_entity_too_large
“`

エラー内容
“`ruby
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 984)

ArgumentError (Unrecognized status code :request_entity_too_large):
“`

## 解決方法
Rails4.2からrequest_entity_too_largeはpayload_too_largeに変更されています。
request_entity_too_largeを使用している部分をpayload_too_largeに変更することで解消します。
“`ruby
render body: nil, status

元記事を表示

プログラミング問題をやってみた (paiza×Qiitaコラボキャンペーン、全25問)

全25問の解答例です.

## Dランク

Bash縛りを設けます.

### N倍の文字列 (スキルチェック通し番号44)

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square/

“`rb
#!/usr/bin/ruby
puts ‘*’*gets.to_i
“`

“`sh
#!/bin/sh
read n
for i in `seq ${n}`; do printf ‘*’; done
“`

### Eメールアドレス (58)

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address/

“`rb
#!/usr/bin/ruby
puts gets.chomp+’@’+gets.chomp
“`

“`sh
#!/bin/sh
read s
printf “${s}”
printf “@”
read s
echo “${s}”
“`

### 足し算

https://paiza.jp/works/mon

元記事を表示

HTML,CSS,Ruby,Railsなどの参考資料まとめ(自分用)

HTML

HTML辞典

→HTMLのデジタル辞書。わからなくなったらここから引く。

https://html-coding.co.jp/annex/dictionary/html/

CSS

・CSS辞典

→CSSのデジタル辞書。わからなくなったらここから引く。

https://html-coding.co.jp/annex/dictionary/css/

https://www.tagindex.com/stylesheet/properties/

Rails

・Railsガイド

→Railsのデジタル辞書。わからなくなったらここから引く。

https://railsguides.jp/

元記事を表示

[rails] pluckとselectの使い分け

## 経緯
あるプロジェクトで、特定のデータを集計して取得する必要がありました。最初にpluckメソッドを使用してデータを取得しましたが、取得したデータをハッシュ化する際に配列の順番を間違えてしまい、エラーが発生しました。これは、pluckメソッドが配列を返すため、各要素の順番を正しく処理する必要があるためでした。

## pluckメソッドとは
pluckメソッドは、ActiveRecordのクエリメソッドの一つで、指定したカラムの値を直接配列として取得する際に使用されます。例えば、以下のように使用します。

“`
user_data = User.where(active: true).pluck(:id, :name)

# => [[1, “Alice”], [2, “Bob”], [3, “Charlie”]]
“`
このクエリは、activeカラムがtrueのユーザーのidとnameを配列として取得します。しかし、複数のカラムを取得した場合、各要素の順番を意識する必要があります。

#### メリット
・シンプルで高速なクエリ実行
・必要なカラムのみを取得するため、メモ

元記事を表示

【個人開発】釣り具の登録、管理、検索ができるアプリを開発しました🎣

# はじめに
こんにちは![レイ](https://twitter.com/ida09r)と申します!

未経験からエンジニア目指して日々学習をしております。

今回、釣り道具に特化した「[Tackle Master(タックルマスター)](https://tacklemaster.net/)」というサービスを開発しました。

釣りに興味のある方や好きな方には、ぜひ使っていただけると嬉しいです。

### 自己紹介

地元の工業高校で情報系コースを専攻し、PC操作やプログラミング(Python、SQL、HTML/CSS)を簡単に学びました。
卒業後は総合化学品メーカーで製造オペレーターとして約3年間勤務。その際、社内ITシステムに助けられた経験から、システム開発に興味を持ちました。

2024年2月からプログラミングスクール「RUNTEQ」に入学し、エンジニアを目指しています。

# 1.サービス紹介

「Tackle Master」は釣り道具に特化したサービスで、釣り道具の管理・登録・検索ができます。

![tackle_service.jpg](https://qiita-image

元記事を表示

Ruby: any?メソッドについて

補足 2024 07/19
@scivolaさんよりご指摘いただいた内容を反映

## 読んで欲しい人

– any?メソッドがわからん人
– 過去の俺

## 動作環境

– ruby 3.3.0

## any?メソッドとは

– 配列やハッシュなどのコレクションに対して使用する
– ~~要素内に1つでもtrueを見つければtrueを返す。全ての要素がfalseならfalseを返す~~
– 1 つでも真な要素があれば true を返す。全ての要素が偽なら false を返す

“`ruby
[nil, false, nil, false, true].any?
=> true
“`

– ブロックで条件を指定できる

“`ruby
[1, 2, 3].any? { |v| v > 3 }
=> false
“`

*追記: 2024/07/19*
– 全ての要素が偽というのは、要素がない場合にも成り立つ

“`ruby
[].any?
=> false
“`

## なんで配列、ハッシュの要素1つ1つをチェックできるのか?

`any?`はEnumerableモジュール

元記事を表示

deleteメソッドの戻り値は、最後に削除した要素の値である

Action Mailerを使って、アプリに登録されている全ユーザにメールを送信するという実装をしたのですが、メールが飛ばないというような事がありました。
実際のコードがこちらです!
“`ruby
@posts = Post.yesterday_liked_ranking_top_ten
mail(to: User.pluck(:email).delete(”), subject: default_i18n_subject)
# emailを登録していないユーザもいるので、空であれば削除する
“`
emailを登録していないユーザもいるので、pluckして取得した値のうち、空文字は削除するといった実装です。
この時点で既にお気づきの方もいらっしゃると思いますが、この記述だとmailのto引数には空を渡してしまうのです。

実際にコンソールで挙動を確認してみましょう!
“`ruby
>> emails = User.pluck(:email)
User Pluck (1.0ms) SELECT “users”.”email” FROM “users”
=> [“”, “”,

元記事を表示

RSpecでRailsのテストを書いてみる

# はじめに
Railsの自動テストを学ぶにあたって、RSpecでの実装方法を勉強したので書き残していく。
Ruby:3.2.1
Rails:7.1.2
# RSpec のセットアップ
gemの追加。`rspec-rails`をGemfileに追加する。
“`ruby:Gemfile
group :development, :test do
gem ‘rspec-rails’
end
“`
テスト用のデータベースを設計。今回はSQLiteを採用。
“`ruby:config/database.yml
test:
<<: *default database: db/test.sqlite3 ``` RSpecの基本的な設ファイルの追加。 ```shell-session $ rails generate rspec:install ``` ## テストの作成 モデル/ビュー/コントローラーでそれぞれテストを作成していく。 RSpecの基本的な書き方は以下。 ```ruby RSpec.describe User, type: :mode do it

元記事を表示

[Ruby] メール配信設定の処理における「大きな泥団子」を責務分離した上で、キャッシュ化した話

## 問題点
メール配信設定に関する機能についてです。

SendGrid では、メール配信を行うために (CNAME・ないし MX/TXT 形式の)DNS 登録・及び認証が必須となっており、その認証状態を確認するための [Domain Validation API](https://www.twilio.com/docs/sendgrid/api-reference/domain-authentication/validate-a-domain-authentication) が提供されています。

その DNS 認証を行うための処理をクラス化していたのですが、無関係の様々な処理(例えば「メール配信結果にまつわる情報取得など」)も役割を持たせられており、責務が肥大化し、いわゆる「大きな泥団子」と化していました。

その状態で過剰にリクエストされた結果、ある時 SendGrid API から Rate Limit 超過エラーを受け取るケースが発生しました。

## 分析
まず掲題の外部 API が許容している Rate Limit の詳細を確認しました。

公式ドキュメントを見ても詳細

元記事を表示

migrationで不整合を防ぐ

# はじめに
昨日コーディングインタビューにて「migrationファイルにおける不整合データの対策について」を問われた際にパッと答えることができなかったので、ここで供養していく。

# 問題
以下のようなテーブル定義のmigrationファイルがあった際、どのようにして不整合データの対策をしていくかといった内容。(以下Ruby on Railsのmigrationを例に)
“` ruby:
def up
create_table :follows do |t|
t.references :follow_to, foreign_key: { to_table: :users }
t.references :follow_by, foreign_key: { to_table: :users }
t.timestamps
end
end
“`
よくあるsnsのユーザーフォローの機能のテーブルをイメージしていただきたい。
followsテーブルとusersテーブルは1:Nの関係になっている。

## どんな不整合が起こりうるか

元記事を表示

devise 退会済みユーザー ログイン実行「すでにログインしています。」と出る件

# はじめに
ポートフォリオの最終チェックしていると、退会済みユーザーがログインできてしまうことが発覚😱
前まではちゃんとブロックできてたのに…
ということで解決したのでアウトプットしておきます✍️

# 現象

退会済みのユーザー情報でログインを実行するとこのようになります

![スクリーンショット 2024-07-17 16.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/385d0bf0-f709-8173-20d1-2e212d1c64b9.png)

“`sessions_controllre.rb
# frozen_string_literal: true

class Public::SessionsController < Devise::SessionsController before_action :user_status, only: [:create] : private # アクティブ判断メソッド def user_status

元記事を表示

日にちの始まりを取得する方法

「前日に」いいねされた記事を取得するという実装をするために、日にちの始まりと終わりを簡単に取得する方法を調べたので、備忘録として残しておきます!
## 日にちの始まりを取得する方法
“`ruby
time = Time.current
=> Wed, 17 Jul 2024 13:58:08.985319000 JST +09:00
time.beginning_of_day
=> Wed, 17 Jul 2024 00:00:00.000000000 JST +09:00
“`
他にも日にちを取得する便利なメソッドが多数用意されていました。
“`ruby
# 日にちの終わりを取得する
>> time.end_of_day
=> Wed, 17 Jul 2024 23:59:59.999999999 JST +09:00

# 日にちの年の始まりを取得する
>> time.beginning_of_year
=> Mon, 01 Jan 2024 00:00:00.000000000 JST +09:00

# 日にちの週の始まりを取得する
>> time.beginning_o

元記事を表示

【Rails7】Maps JavaScript APIで住所オートコンプリート入力の新規投稿機能を実装する

## 自己紹介
はじめまして、はる([@lemonade_37](https://twitter.com/lemonade_37))と申します。
駆け出しエンジニアとして働き始めて約4ヶ月が経過しました🐣

## 概要
だいぶ期間が空いてしまいましたが、前回の
[【Rails7】Maps JavaScript APIを使って投稿を地図上にピンで表示する](https://qiita.com/lemonade_37/items/51ca0f18fd9da842bb00)
の続きとして、位置情報を含んだMapと連動できる新規投稿機能を実装していきます。

### 完成イメージ図

![qiita02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/3b8b4830-58d7-7454-715e-11a980d9cbdf.gif)

![qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34716

元記事を表示

チェリー本7.7.6

# チェリー本7.7.6一部解説

Ruby のメソッド定義は式になっていて、 メソッド定義が完了するとメソッド名をシンボルとして返します。
これを利用すると、メソッド定義が正常に行われたかどうかを確認したり、メソッド名を後で利用することができます。
“`
def foo
‘foo’
end
#=> :foo
“`
この知識を応用すると、 次のようにメソッド定義と同時にそのメソッドをprivateメソッドにすることが可能です。

“`
class User

private def foo
 ’foo’
end

end

user = User.new
user.foo #=> private method ‘foo’ called for # (NoMethodError)
“`
・流れ
①fooメソッドが定義される
②シンボル:fooは、その返り値となる
③:fooがprivateメソッドの引数となるため、foo メソッドは private として扱われる。

元記事を表示

【Ruby】エイリアスメソッドについてのまとめ_Ruby Silver対策

Ruby Silverの勉強をする中で同じ機能のメソッドの問題が結構あったので、
この機会にしっかりとまとめようと思います。

# Arrayクラス

## map, collect
各要素に処理を施す(非破壊)

“`ruby
p (1..3).map {|n| n * 3 } # => [3, 6, 9]
p (1..3).collect {|n| n * 3 } # => [3, 6, 9]
“`

## map!, collect!
map,collecgtの破壊版
“`ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.collect! { |item| item * 3 }
p array # => [3, 6, 9, 12, 15, 18, 21, 24, 27]
“`

“`ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.map! { |item| item * 3 }
p array # => [3, 6, 9, 12, 15, 18, 21, 24, 27]
“`

元記事を表示

RspecのBigQuery操作でSignet::AuthorizationError

## 事象
– rspecで`bigquery-emulator`に対してテストを実行した時に、以下のエラーが発生しました。
“`
Signet::AuthorizationError:
Authorization failed. Server message:
{“error”:”invalid_grant”,”error_description”:”Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values in the JWT claim.”}
“`

## 原因
– わかってしまえば簡単なのですが、rspecで`travel_to`使って時間を止めてテストしたことです。
“`ruby
travel_to Time.zone.local(2027, 7, 10) do
  # 省略
end
“`

– BigQueryはJWT認証を使っているみたいで、`iat`,`exp`に時刻が入

元記事を表示

【2024年版】Ruby技術者認定試験に合格してみて【Gold編】

## はじめに

2024 年の 6 月 27 日に**Ruby Association Certified Ruby Programmer Gold version 3**(~~正式名称が長い~~)に合格したので、どう勉強をしたのか実際に役立ったのか等を
**Silver 編**に続く**Gold 編**を紹介します。

内容は以下の記事と一部重複します。

https://qiita.com/kim_t0814/items/8e8712c6b55d0fe22009

## Ruby 技術者認定試験とは

Ruby ベースのシステムを設計、開発、運用するエンジニア、Ruby でシステム提案を行うコンサルタント、Ruby を教える講師及び Ruby を学ぶ学生などを対象とした認定試験制度です。

### Gold

Ruby の文法知識、Ruby のクラスとオブジェクト、標準ライブラリの知識について、基本的な技術レベルを持つことを認定します。

https://www.ruby.or.jp/ja/certification/examination/

ちなみに、Gold の認定条件は

元記事を表示

RSpec入門:基本構文と使い方を紹介

# はじめに

こんにちは!
社会人一年目の石川です。
記事をご覧いただきありがとうございます。

現在、私はRSpecを勉強中で、学んだことを共有したいと思いこの記事を書きました。この記事では、RSpecの基本的な書き方を紹介し、具体的な例を通して理解を深めていきます。
初心者でも理解しやすいように書いたのでRSpecを勉強したい際はぜひ参考にしてください。

## 目次
1. [RSpecとは?](#rspecとは)
1. [基本的なRSpecの書き方](#基本的なrspecの書き方)
・[describe、context、itの使い方](#describecontextitの使い方)
・[最初のテストケースの例](#最初のテストケースの例)
3. [よく使われるマッチャ(Matchers)](#よく使われるマッチャmatchers)
・[eq、be、include、matchなどの基本的なマッチャ](#eqbeincludematchなどの基本的なマッチャ)
・[複数のマッチャを使用した例](#複数のマッチャを使用した例)
4. [最後に](#最後に)

## RSpecとは?

元記事を表示

[Rails] any?メソッドとは?をまとめた

# any? メソッドとは
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/any=3f.html

配列の要素が、全て**偽**の場合、`false`を返します。
一つでも**真**の要素があれば、`true`を返すメソッドになります。

# 例

“`rb
p [nil, true, 99].any? # => true
p [nil, false, 99].any? # => false
“`

# ブロックを使用する
ブロックを伴う場合は、各要素に評価され、全て**偽**の場合、`false`を返します。
評価の時点で真を返した時点で、`true`を返します。

“`rb
p [5, 10].any? {|v| v > 20 } # => false
p [5, 10].any? {|v| v > 6 } # => true
“`

# 引数を使用する
引数を渡して、処理することもできます。

ブロックと同じで、引数で渡したオブジェクトと各要素が一致するか評価され、全て**偽**の場合、`false`を

元記事を表示

OTHERカテゴリの最新記事