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

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

RailsアプリケーションにBulletを導入してN+1問題を発見する

## はじめに

RailsのN+1クエリ問題は、データベースのパフォーマンスを大きく低下させる原因となります。この問題を解決するために、`bullet` ジェムを導入し、効率的に問題を特定し、解決する方法を紹介します。

## BulletGemの導入

1. **Gemfileに追加**

開発環境でのみ`bullet`を使用するように設定します。

“`ruby
group :development do
gem ‘bullet’
end
“`

2. **インストール**

変更を加えたら、コマンドラインで以下を実行して、gemをインストールします。

“`bash
bundle
“`

### Bulletの設定

`config/environments/development.rb`にBulletの設定を追加します。

“`ruby
config.after_initialize do
Bullet.enable = true # Bulletを有効にする

元記事を表示

railsでjsonを返すAPIエンドポイントを返す方法とpostmanでの確認

## 対象読者

元記事を表示

railsでのお作法について纏めてみた

## 対象読者
– railsを初めて触る人
– 簡単なCRUD、ルーティングまでを一つの記事で理解したい方
– apiとwebのエンドポイントを共存させるほう法を知りたい方

元記事を表示

RailsアプリケーションにおけるDateパースの重要性

Railsの開発では、日付の扱いが意外とトリッキーな場面に遭遇することがあります。今回は、私が開発中の予約システムで直面した一つの問題と、その解決策について共有したいと思います。

## 背景

予約システムでは、様々なサービスに対して顧客が予約できるようにするため、日付を元に利用可能な時間帯やサービスの空き状況を確認する機能が必要です。特に、日付をパラメータとして受け取り、それを基にスケジュールを計算する必要がありました。

## 問題の発生

以下の`for_customer_index`メソッドでは、`@service_availability`の値が正常に取得できていましたが、`new`メソッドでは`@service_availability`が期待した値を返さないという問題が発生しました。

“`ruby
def for_customer_index

@date = Date.parse(params[:date]) # この行が重要

end
“`

“`ruby
def new
@date = params[:date]

元記事を表示

ancestry gemで発生するN+1問題の解決法

# はじめに
Railsで階層構造を持つデータモデルを扱う際に使用する`ancestry` gem。便利なメソッドが準備されている反面、そのまま使用してしまうとN+1を起こしパフォーマンス的に良くない状態になってしまったので、どうやって解決したかを説明します。

## TL;DR
`ancestry` gemを使用して親子関係を扱う際に、メソッドを使わず自己参照のリレーションを利用することでN+1問題を解消できます。

# 環境
Ruby 3.3.0
Rails 7.1.3.2
ancestry 4.3.3

## 親子関係とN+1問題の例
`ancestry` gemを使うと、カテゴリーのような階層構造を持つモデルを簡単に作成できます。例えば、以下のようにCategoryモデル単体で階層化されたモデルを例に考えます。

“`ruby
# category.rb
class Category < ApplicationRecord has_ancestry end ``` N+1を起こす原因箇所 ```erb -# index.html.erb

Railsチュートリアル第10章まとめ

## 10章
edit、update、index、destroyアクションを加え、RESTアクションを完成させる
ユーザーが自分のプロフィールを自分で更新できるようにし
ユーザーを削除し、データベースから完全に消去する機能も追加していく

## 10章 10.1ユーザーを更新する
ユーザー情報を編集するパターンは、新規ユーザーの作成と極めて似通っている。
newアクションと同じようにeditアクションを追加していく。

POSTリクエストに応答するcreateの代わりに、PATCHリクエストに応答するupdateアクションを作成。

## 10.1.1編集フォーム
Userコントローラーにeditアクションを追加しビューを追加していく。
前提としてユーザー情報を読み込む必要がある。

“`app/controllers/users_controller.rb
class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new

【個人開発】VTuberの発見と布教が出来るWebアプリを作りました

# はじめに
初めてのWebアプリケーション開発をしてみました。
名前は`にゅーぶい!`です。

https://newvtuber.com/

どのようなものか書きます。

# どのようなアプリか
### 簡単な紹介
ファンは自分がまだ知らないVTuberの発見と布教、VTuberはファンの獲得が出来ることを目指したサービスです。

### 想い
VTuberという文化が生まれてから久しく、現在では数えきれないほどVTuberがいます。
そのため、自分のタイプや好みに合うまだ知らないVTuberがきっと多くいます。
そこで、VTuberのプロフィール閲覧/作成を行えるサービスがあれば、より楽しい推し活に繋がると思い、本アプリの開発をしました。

# 使い方
### 文字のみ
一部ユーザー登録の必要なものがありますが、登録やログイン等の記述は割愛します。
最低限の使い方は下記の2つです。
① 一覧から気になるVTuberを押す
② プロフィールを見る
上記に加えて、下記の使い方もすると少し豊かになります。
・ ご自身の好きなVTuberのプロフィールが無い場合は作成する

[Rails]タスク管理アプリ(Part.1)

## はじめに

Railsでタスク管理アプリを作成します。
利用する各ツールのバージョンは以下とします。
|ツール|バージョン|
|-|-|
|Ruby|3.2.4|
|Ruby on Rails|7.1.3.2|
|PostgreSQL|16.2|

## アプリケーションのひな型を作成する

アプリケーションのひな型を作成します。
実行には少し時間がかかります。
“`bash:
rails new taskapp -d postgresql
“`

実行が完了したらアプリケーションフォルダに移動します。
“`bash:
cd taskapp
“`

データベースを作成します。
“`bash:
bin/rails db:create
“`
2つのデータベースが作成されました。
>$ bin/rails db:create
Created database ‘taskapp_development’
Created database ‘taskapp_test’

サーバを起動します。
“`bash:
bin/rails s
“`

以下にアクセスします。

htt

【Rails】モデルが特定のメソッドを呼び出せるか検証する方法

`respond_to?()`を使用すると引数に指定したメソッドが呼び出せるか検証できます。
呼び出せれば`true`を呼び出せなければ`false`を返却します。

“`rb
モデル.respond_to?(メソッド名, include_private=false)
“`

Userモデルがname属性を呼び出せるか検証するには以下のように記述します。

“`rb
user.respond_to?(:name)
“`

プライベートメソッドを呼び出せるか検証するには以下のようにします。

“`rb
user.respond_to?(:private_name, true)
“`

【Rails】データベースに反映済みのマイグレーションファイルの修正方法

マイグレーションファイルを作成して, rails db:migrate し, あとからカラム名のタイポに気づきました

“`db/migrate/20240502121245_create_checkouts.rb
class CreateCheckouts < ActiveRecord::Migration[7.0] def change create_table :checkouts do |t| t.string :fisrt_name # first_name としたかった t.timestamps end end end ``` rails db:migrate していない場合は, そのままマイグレーションファイルを編集すればよいですが, すでにしている場合はデータベースに反映されているため, ロールバックをする必要があります。 反映されているかは rails db:migrate:status で確認できます。up になっていれば反映済み, down になっていれば未反映です。 今回は以下のように up

【未経験】AIであなたもアーティスト!個展生成サービスを作成しました【Next.js / Rails API / Three.js】

# はじめに
こんにちは!
ガク(@Necono_Engineer)と申します。
未経験からエンジニア転職を目指して、日々学習をしています。

この度、( **[Gallery.ai](https://ai-coten-nu.vercel.app/) )** を開発しました。

# サービス名 : **[Gallery.ai](https://ai-coten-nu.vercel.app/)**

![GOGP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/a05ab668-5f14-3afa-3971-3d6a1a9009f8.png)

▼ サービスURL

https://ai-coten-nu.vercel.app/

▼ Githubリポジトリ

https://github.com/gadname/AI_coten

# サービス概要
`AIイラスト生成機能`を搭載したオンラインギャラリーサービスです。

例えば、

rails + mysql8 + kaminariの時にpaginationでtimeoutする

## 起きる問題
mysql8.0.23以降で、select count(*) が、パラレルスキャンによりもの凄い時間がかかるようになってしまうため、kaminariのpaginationで表示がpumaなどがtimeoutしてしまう。

そもそもの問題の詳細はこちら

https://zenn.dev/hmatsu47/articles/mysql80-count-slowdown

## 原因の調査
kaminariではページ数をしらべるために、上記のクエリーを発行しています。
これはkaminariのAR拡張で実装されています。

“`ruby:kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb

def total_count(column_name = :all, _options = nil) #:nodoc:
return @total_count if defined?(@total_count) && @total_count

[Rails]ユーザー管理機能

### 1. ユーザーに関するscaffoldを自動生成する。
“`bash:
bin/rails generate scaffold user name:string address:string age:integer
“`
>$ bin/rails generate scaffold user name:string address:string age:integer
invoke active_record
create db/migrate/20240504174055_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
invoke resource_route
route resources :users
invoke

[Ruby]環境構築(Windows11)

## 1. Ubuntuのインストール
Microsoft Storeにて、「Ubuntu」をダウンロードする。
https://apps.microsoft.com/detail/9pn20msr04dw?hl=ja-JP&gl=US

ダウンロードしたファイルは以下。(2024/05/04時点)
・Ubuntu 22.04.3 LTS Installer.exe

ユーザーとパスワードを設定する。

Ubuntuのパッケージファイルを最新化する。
“`bash:
sudo apt update
sudo apt update -y
“`

作業用フォルダとシンボリックリンクを作成しておく。
“`bash:
mkdir /mnt/c/Code
ln -s /mnt/c/Code ~/Code
“`

## 2. rbenvのインストール
rbenvをインストールする。
“`bash:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
“`

パスを設定する。
“`bash:
echo ‘export PATH=”

Rack::Attackを用いたDoS攻撃防止策の設定方法

# はじめに

この記事では、RailsアプリケーションにおけるDoS攻撃防止策として、`Rack::Attack`の設定方法についてステップバイステップで解説します。`Rack::Attack`は、不正なアクセスや不要なトラフィックを制限するためのミドルウェアであり、アプリケーションを保護する上で非常に有効です。

## ステップ1: Gem の追加

まず、Railsプロジェクトの`Gemfile`に以下の行を追加し、`rack-attack` gemをプロジェクトにインクルードします。

“`ruby
gem ‘rack-attack’
“`

追加後、ターミナルで以下のコマンドを実行して、gemをインストールします。

“`bash
bundle
“`

## ステップ2: 初期化ファイルの設定

`rack-attack`の設定を管理するために、`config/initializers/rack_attack.rb`ファイルを作成します。ファイルには、特定のリクエストを制限するための設定を記述します。以下はその一例です。

“`config/initializers

静的HTMLとRailsにおけるコードの比較

## はじめに
静的サイトにおけるHTMLの記述とRails開発におけるコード記述の違いについて、よく使っているコードより簡潔にまとめました。

備忘録として残しつつ、誰かのお役に立てれば幸いです。

## 前提
– HTMLは静的なサイトを想定(CMSはなし)
– Railsは動的なサイトやアプリを想定
– クォーテーションはシングルに統一
– RailsコードとHTMLコードで同じ内容が出力されるように想定
– データベースについて触れない

## 比較

### ファイル拡張子
#### 静的HTML
“`
index.html
“`
拡張子が“`.html“`のみで、名前も自由に決められる。(“`news.html“`、“`contact.html“`など)
#### Rails
“`
index.html.erb
“`
拡張子が“`.html.erb“`で、ビューフォルダへ作成し、名前は“`CRUD“`アクションより決まる。(“`show.html.erb“`、“`new.html.erb“`など)
– – –
### スタイルシート読み込

RailsエンジニアがGolangでアプリ開発してみた

# 背景
今までRubyとRailsで開発をしていましたが、アプリ開発の解像度をあげるためにGolangでのアプリケーション開発を始めました。
RailsではMVCアーキテクチャにのっとりフロントでerbを使用する開発をしていましたが、Golangではアーキテクチャの設計からフロントエンドとAPI通信するプロダクトの開発も行いました。
この記事ではRubyを書いたことがあり、これからGolang開発の始める人へ、一つの踏み台として受け取ってもらえれば幸いです。

# 目次
1. RubyとGolangの違い
1. 動的言語と静的言語
1. コンパイル型言語とインタプリタ型言語
1. フレームワーク
1. Golangの基本文法
1. ポインタ渡し
1. 多値返却
1. 配列とリスト

# RubyとGolangの違い
### 1. 動的言語と静的言語
> **動的言語**: 実行時に変数の型を決定し、実行時に型チェックを行います。変数の型は実行時に決まるため、柔軟性が高いです。例えば、PythonやRubyは動的言語です。
**静的言語*

Railsで複数の隠しフィールドを正しく送信する方法

Railsでフォームを扱う際には、しばしば複数のデータを同時に送信する必要があります。特に、複数選択可能なデータ(例えば、複数のサービスID)を扱う場合、これを隠しフィールドとして正しく送信する方法が重要です。

## 問題点

`hidden_field` を使用して配列データを送信しようとするとき、単一のフィールドで配列を渡そうとすると問題が生じます。以下のように書いた場合、

“`erb
<%= form.hidden_field :service_ids, multiple: true, value: @services.map(&:id) %>
“`

このコードは期待した通りには動作せず、配列が文字列として解釈され、結果的には `”[“3”, “20”]”`や`”[“3 20”]` のような一つの文字列として送信されてしまいます。

## 解決策

この問題を解決するには、各要素に対して個別の `hidden_field` を出力する方法が最も簡単です。具体的には以下のようにします。

“`erb
<% @services.each do |service| %>

Railsで利用しているsitemap_generatorのテストを書く

Railsで `sitemap_generator` gemを利用してサイトマップを生成しています。
https://github.com/kjvarga/sitemap_generator

そのテストを書く方法を記載します。

# 結論

`SitemapGenerator::Interpreter` を使います。
https://www.rubydoc.info/gems/airblade-sitemap_generator/0.3.5/SitemapGenerator/Interpreter

`SitemapGenerator::Interpreter.run` でXMLファイルを生成します。
それを読み込み、期待するURLが含まれているか検証します。

# 検証用Repo

下記で検証をしていますので、詳細が気になる方はご参照ください。
https://github.com/yuya-yuzen/test-sitemap-generator-spec

# 1. sitemap_generatorを導入する

## 1-1. Gemfileに追加

“`:Gemfile

リファクタリング: ScheduleServiceを導入する(パート2)

## 前回の記事

https://qiita.com/KM9973/items/4fc519bf6dc0ec77957e

## ScheduleService の実装詳細

前回の記事で概要を説明した後、このパートでは `ScheduleService` の具体的なメソッド実装と、コントローラーでの利用方法を深掘りします。

## 1. ScheduleServiceのメソッド実装

`ScheduleService` クラスの中核となるメソッドは、特定の日に提供可能なスタッフのスケジュールを取得し、それを元に利用可能な時間スロットの状況を分析します。

### build_staff_schedule_map メソッド

このメソッドは、指定されたサービスを提供可能なスタッフのスケジュールをマッピングします。スタッフごとにその日のスケジュールを配列として保存します。

“`ruby
def self.build_staff_schedule_map(working_staffs, service, date)
working_staffs.each_with_obj