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

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

RSpecのパラレル実行:効率的なテストのための道

## はじめに
開発の現場では、テストの実行時間がプロジェクトの生産性に直接影響を与えます。特に大規模なプロジェクトでは、テストが肥大化し、時間がかかりがちです。ここ最近は私が普段使っているRSpecというRuby on Railsでよく使われるテストの実行時間を削減するためにも、パラレル実行(並列で実行するテストの方法)の導入の必要性を感じ始めました。
この記事は「テストをパラレル化してみたいよ」という計画についてまとめたものになります。

## パラレル実行の必要性
テストの実行時間を短縮することは、開発サイクルを加速し、より迅速なフィードバックを可能にします。これは、バグの早期発見や機能改善の迅速な実装につながり、結果として生産性が向上します。

## 実現方法の具体化(Myappの例)
例えば`Myapp`アプリというでRSpecのパラレル実行を設定するには、以下の手順に従います:

### Gemの導入
– `Gemfile`に`parallel_tests`を追加します。

“`ruby
gem ‘parallel_tests’
“`

– コマ

元記事を表示

【Rails】Active Model Serializersとjson-api-serializerの比較

# はじめに
RailsでAPIモードを扱う時に、`Active Model Serializers`もしくは`json-api-serializer`を`シリアライザー`の選択肢として用いる事がほとんどかと思います。
今回はこれらの`シリアライザー`について簡単に比較してみました。

# シリアライズとは
`オブジェクト`や`データ構造`を、`ファイル`や`データベース`、`ネットワーク`越しの通信でやり取りできる形式(たいていの場合は文字列)に変換することです。`JSON`や`XML`が挙げられます。

# 比較

| 特徴 | ActiveModel::Serializer | json-api-serializer |
|——|————————|————–|
| 設計 | MVCに沿った構造で、JSON構造を細かくコントロールできる | パフォーマンスに特化しており、シンプルな定義で高速にシリアライズ可能 |
| 使用例 | `render json: user, serializer: UserSerialize

元記事を表示

【Rails】rename_tableでテーブル名を変更したらインデックスのエラーが出る

# 発生した問題

rename_tableでテーブル名を変更する際に、インデックス名が長すぎるというエラーが発生しました。
元々のインデックスは64文字以内になってるし、テーブル名変更するだけなのになんで?と思ったので調べてみました。
“`bash
Index name ‘xxx…’ on table ‘table_name’ is too long; the limit is 64 characters
“`

## 環境
– Rails 7.0.5
– MySQL 8.0

# 原因
rename_tableで、テーブル名の変更とともにインデックス名の変更の処理もされていたためでした。
変更後のインデックス名が64文字を超えていたためエラーが出たようです。

## rename_tableの挙動
rename_tableのコードを見てみます。
“`ruby
def rename_table(table_name, new_name)
schema_cache.clear_data_source_cache!(table_name.to_s)
schema_cac

元記事を表示

[Rails] routes.rbのnamespace, module, scopeの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbでnamespaceが使用されていたので、その意味、また使用方法が似ているmoduleとscopeとの違いについて備忘録、知識の定着のためにまとめる。

1.namespace
2.scope
3.module

# 1.namespace
namespaceの中にルーティング設定を記述すると
・urlがnamespaceで指定したモジュール名下のpathになる
・controllerファイルがnamespaceで指定したモジュール名のディレクトリ下に配置される
・controllerのクラス名が`namespaceで指定したモジュール名::コントローラ名` になる
### 例)
### routes.rbに記述
“`
Rails.application.routes.draw do
namespace :admin do
resources :users
end
end
“`
#### $rails routes
“`
admin_users GET    /admin/users(

元記事を表示

【Rails】バリデーションのuniqueness: trueについて

# はじめに

お疲れさまです!
おおくまです!

今回は、“Ruby on Rails“のバリデーションの“uniqueness: true“についてです!
基礎的なことなのですが、備忘録として残したいと思います!

# 注意点

:::note warn
内容に誤りがある場合があります!
コメント等で教えていただけると幸甚です!
:::

# 環境

:::note
Ruby 3.2.2
Rails 7.0.6
:::

# バリデーションとは

https://railsguides.jp/active_record_validations.html

“バリデーション“とは、“Ruby on Rails“の“Active Record“に搭載されている**正しいデータだけをデータベースに保存するための機能**です!

一般に利用可能な“ビルトインヘルパー“が用意されており、
– “presnce“:指定された属性が空でないことをバリデーション
– “numericality“:指定された属性に数値のみが使われていることをバリデーション
– “l

元記事を表示

【Rails】外部APIを自社システムに連携するまでの流れを解説

## はじめに
どうもこんにちは、もきお([@mokio_50](https://twitter.com/mokio_50))です。
突然ですが上司から「このAPIうちのシステムで使えるよう実装しておいてもらえる?」と言われたら実装イメージは付きますでしょうか?

もちろんこんな雑なタスクの振り方はされないですが、当時の自分はさっぱりわけワカメ状態でした。なので今回はAPI連携には何が必要でどういうふうに実装したら良いのかを解説していきたいと思います。

あくまで実装の一例程度に見ていただけますと幸いです。

また実際に実装した一連の流れは以下の記事にまとめていますので合わせてご覧いただけますと幸いです。

https://qiita.com/mokio/items/6e65ff8572f303c18750

先日交流会でもLT登壇した際にこの話をしたので忙しければこちらでも!

https://docs.google.com/presentation/d/1ZqJGjvaKSLI-In6XAd_4fvknPLBzdOevkbR_XfJZFfU/edit#slide=id.g12adc

元記事を表示

railsでブロック機能実装してみた

# 概要
ブロック機能を実装しようとしたところ、記事としてまとめられているものがなかったのでアドベントカレンダーの企画に便乗して記事の執筆に挑戦しました!!

初めて記事を書くので拙いコード、文章になってしまっていたらごめんなさい
この記事を参考にしてブロック機能を実装して頂けたらうれしいです
改善点などあればぜひコメントお願いします

## 具体的にできること
ユーザーをブロックした場合そのユーザーから
– マイページを見られない
– フォローされない
– DMが送られてこない
– 投稿一覧、いいねした投稿一覧を見られない

マイページのみにフォローボタン、DMのリンク、投稿一覧、いいねした投稿一覧を置く
➡ブロックされている場合は通常のマイページを見られなくする
➡不審なユーザーからアクセスされないっていう感じです

# 完成図
![Geektwitter12 – Google Chrome 2023-12-10 16-38-32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634732/160

元記事を表示

Rails7×Svelte でWebアプリ開発 part2

# はじめに

こちらは [Rails7×Svelte でWebアプリ開発 part1 (環境設定、簡単な表示まで)](https://qiita.com/Satoooon/items/cc6df7679ecd74c2fa11) の続きになります

# Svelte コンポーネントに props を渡す

User model, 詳細画面用の controller, views を作成します

“`
$ bin/rails g model User name:string email:string
$ bin/rails db:migrate
$ bin/rails g controller users show
“`

適当なデータを作成します試しにこちらを使います

“`
irb(main):001> User.find(1)
TRANSACTION (0.0ms) begin transaction
User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = ? LIMIT ?

元記事を表示

[rails] find_by_sqlで結合先テーブルのカラムを取得する

# はじめに
Active Recordで表現しきれないクエリを記述するときに活躍するfind_by_sqlですが、find_by_sqlを呼び出したモデル以外のテーブルのカラムを取得する際に少し悩んだのでそちらを共有します。

(※実際にfind_by_sqlを使用する場合は複雑なテーブル構造やクエリが想定されますが、今回は簡単のため単縦なテーブル構造とクエリを使用します。)
## テーブル構成

##### usersテーブル
|id|name |age|
|–|——|—|
|1 |taro |20 |
|2 |hanako|22 |

##### postsテーブル
|id|title |user_id|
|–|————-|——-|
|1 |taro’s post |1 |
|2 |hanako’s post|2 |

## 結合先テーブルのカラムを取得する
以下のように結合先のテーブルのカラムも取得するSELEC文を記述し、`Post.find_by_sql`を実行して見ると戻り値はpostテーブル

元記事を表示

計画的なDBスキーマ変更のためのRails Active Recordの実践的知識

この記事は[株式会社エス・エム・エス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/bm-sms)の17日目の記事です。

Railsアプリケーションのライフサイクルにおいて、データベーススキーマの適切な変更は、システムの整合性と拡張性を保つ上で不可欠な要素です。

本記事では、Active Recordがデータベーススキーマ情報をどのように取得し、キャッシュしているのか、そしてこれを利用してRailsアプリケーションがどのように動作するかについて掘り下げます。
それを踏まえて、スキーマ変更の適切なタイミングについて検討して行きます。

※本記事で使用するRailsとDBのバージョンは、`Rails 7.1.2`と`PostgreSQL 15.5`です。

# Active Recordとデータベーススキーマ
### Active Recordを通じて得られるスキーマ情報

Active Recordは、データベーススキーマに関する情報をDBに問い合わせ、取得した情報をキャッシュします。これには、テーブル名、カ

元記事を表示

JqueryでRedmineの「チケットページ」をもっと便利に(年ごと、月ごと、四半期ごとの集計機能の開発)

## JqueryでRedmineの「チケットページ」をもっと便利に(年ごと、月ごと、四半期ごとの集計機能の開発)

[Redmine Advent Calendar 2023](https://adventar.org/calendars/8974)の16日目の記事として作成しました。

* * *
### 既存のRedmineで不便なこと、改善したい点

Redmineのチケットページでは、強力なフィルタリングとグルーピング機能が提供されていて、その機能を活用することで、必要な情報を必要な出力結果として取得することができます。
グルーピング機能は同じグループごとに、そのグループに属しているチケットの件数と、そのグループのタイトル部分で開閉ができるので、不要なグループは閉じることによって、必要なチケットだけを表示でき、可読性の向上に寄与しています。
下図の例のように、「トラッカー」でグルーピングをして、グルーピングのタイトルであるトラッカー名ごとに表示、非表示をタイトルをクリックすることで可能になります。

チケットページのフィルタリン</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Ruby</div>
<div class='tag-cloud-link'>JavaScript</div>
<div class='tag-cloud-link'>Rails</div>
<div class='tag-cloud-link'>jQuery</div>
<div class='tag-cloud-link'>Redmine</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/yam_asaki/items/176d07588793b3e66b5d'>元記事を表示</a></div>
<h3 id=importmap-railsを使ってMetaMask認証をしてみる。

## あいさつ
こんにちは、[ryosk7](https://x.com/ryosk7)です。

この記事は、[Ruby on Rails Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ruby-on-rails) 16日目の記事です。

## はじめに

技術書典15で出展した「Rubyでつくる NFTマーケットプレイス」を参考に、MetaMask認証機能を作っていきます。

https://techbookfest.org/product/4D0SCAdL9Rk75SttLJ4xsS?productVariantID=mihs8CKjPy3SvwUwF1N3XJ

元々、NFTマーケットプレイスを実装する際に、こちらの記事を参考にしていました。

https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj

ただし、こちらの記事ではJavaScript(以下JS)をゴリゴリ書いており、筆者はそこまでJSを書きたくなかったので、

元記事を表示

Railsにおける共通化の方法: Concern, Helper, Service, Decorator

# Railsにおける共通化の方法: Concern, Helper, Service, Decorator

### はじめに

Ruby on Railsはその堅牢性と柔軟性で知られており、アプリケーションのコードベースを整理し、再利用可能にする多くの機能を提供しています。この記事では、Rails開発における主要な共通化のパターンである`Concerns`, `Helpers`, `Service Objects`, および`Decorators`について詳しく見ていきます。

### Concerns

#### 概要
– `ActiveSupport::Concern`は、モデルやコントローラのコードをモジュール化し、関連する機能を整理して再利用するために使われます。
– モジュール内で定義されたメソッドやスコープは、複数のクラスで簡単に共有できます。

#### 使用例
“`ruby
module Commentable
extend ActiveSupport::Concern

included do
has_many :comments
end

元記事を表示

Ruby on Rails で ElasticSearch をChewyで検索した際のN+1問題

Ruby on Rails で ElasticSearch と Chewyを活用して全文検索を実装しています。

> ### Chewyとは?
> Chewy is an ODM (Object Document Mapper), built on top of the official Elasticsearch client.
> https://github.com/toptal/chewy

検索した際にN+1問題がBulletで検知されました。

“`ruby
objects = ParentModelIndex.query(match_query).load.objects
objects.each do |obj|
obj.child # ここの行で
end
“`

N+1が検出されます。

“`text
GET /…
USE eager loading detected
ParentModel => [:child_model]
Add to your query: .includes([:child_model])
Call stack
“`

##

元記事を表示

Fly.ioでrails db:seedを実行する方法

## 自己紹介
はじめまして、はると申します。現在はスクールに通いながら学習をしています🐥

## 概要
Fly.ioでRailsアプリをデプロイした際に、`rails db:seed`を実行する方法。

### 環境
– Ruby: 3.2.2
– Rails: 7.0.8

:::note warn
初学者のためデプロイ周りの知識が浅く、間違っている箇所がある可能性があります。また、うまく行った方法の1つを紹介していますが、より良い方法を知っている方がいたら教えて頂けると嬉しいです🙇
:::

## 結論
RAMサイズを`256MB`から`512MB`に上げた後、

このコマンドでうまくいきました。
“`
hogehoge@hogehogenoMBP アプリ名 % flyctl console

irb(main):001:0> Rails.application.load_seed
=> true
“`

## 詳細
Fly.ioでのseeds.rbの反映方法について調べて見つけたコマンドを実行しましたが、下記のようなエラーが出て実行できませんでした。

“`
hoge

元記事を表示

【Rails】StimulusでGoogleMapApiを扱ったら良い感じだった話

## この投稿は、

DMM WEBCAMP Advent Calendar 2023
シリーズ2 投稿7日目のエントリー(大遅刻穴埋め勢)です。

6日目は、@Hiron0120 さんで、

https://qiita.com/Hiron0120/items/c1e1c5fedc3871c92855

でした。

## はじめに
DMM WEBCAMP でメンターをやらせていただいております。 @tomoaki-kimura です。
Rails7はフロント周りがとても楽しくなりました。 `Stimulus`もその一つです。丁度よい機能と学習コストです。
Rails6環境でも `Stimulus` を使ったJSの管理はかなり有用です。

JQueryも状況によっては全然アリなのですが、どうやら世の中脱JQueryの流れにはなっているようですし、今後を踏まえてキャッチアップしておくのも手ではないでしょうか。

という事で今回は、GoogleMapApiを [Stimulus](https://github.com/hotwired/stimulus-rails)で書いていこうと思います

元記事を表示

概念から理解するTurbo Streamsを使ったリアルタイム通信

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー14日目です。

Turbo Stream(ActionCable)を使ったリアルタイム通信について学習したので、引き続きまとめます。

[こちらの記事](https://qiita.com/eichann/items/bc1ea15184b7bdc2b264)ではリアルタイム通信を実現する仕組みとしてWebsocketを紹介し、Action CableがWebsocketを扱うための機構であることを説明しました。

本記事では、もう少し具体的にリアルタイム通信を行うイメージを説明したあと、実際のコードでどのように書くのかを紹介します。

# Railsのリアルタイム通信の流れ

### 1.サーバ側でリアルタイム通信の準備をする
リアルタイム通信をするためには、サーバ側にてあらかじめ準備が必要です。どんな情報を送るのかなどを決めておきます。これを、チャンネル(チャネル?)と呼びます。RailsではActionCableにてChannelというクラスが用意されており、Railsアプリ内にこのク

元記事を表示

Rails × ChatGPT 投稿内容をAIで加工する

:::note warn
**この記事のポイント:** OpenAI APIを使って投稿内容を加工する機能を作りました。今回はある意味ジョーク的な機能ですが、実際にどんな使い道があるかの検討も最後に触れています。
:::

# はじめに

[前回の記事](https://qiita.com/MaTTA_RUNTEQ50B/items/3cb46ddf1be17899df00)でRailsにChatGPT(OpenAI API)による生成テキストをindex画面に表示させる実験を行いました。APIを叩けたことは良いのですが有用かと問われるとそうでもなく、さらにいうとページを読み込むたびにレスポンス待ちに数秒かかるという始末でした。

せめてもう少しだけ実用的な使い道を考えようというのが今回のモチベーションです。

RailsにChatGPTのAPIを用いる流れは前回の記事を参考ください

https://qiita.com/MaTTA_RUNTEQ50B/items/3cb46ddf1be17899df00

# 完成品
Western Modeにチェックを入れた状態で投稿す

元記事を表示

リリースから7年間EC2で稼働していたWEBサービスをついにコンテナ化した話

:::note info
この記事はLITALICO Advent Calendar 2023のカレンダー2の16日目の記事です。
https://qiita.com/advent-calendar/2023/litalico
:::

# はじめに

## 自己紹介

株式会社LITALICOでWEBエンジニアをやっています。ti-aiutoと申します。

普段は個人向けのWEBサービスの開発を担当していて、特にモノリスなアプリケーションを持続可能な形に保つこと、フロントエンドの開発しやすい環境を整えることに関心があります。

今年度から、新設の基盤グループというところに異動して、セキュリティ面・パフォーマンス面や開発効率向上などの観点から色々と動いていく仕事をしています。

## 何の話か

タイトルの通り、作業時点で7周年とそれなりに歴史のあるWEBサービスをEC2からFargateに移行するのを頑張りました!という話です。

作業していく中で検討したポイントや大変だったところなど紹介していければと思います。

## 対象読者

WEBエンジニアの皆さまに読み物としてふ〜んという

元記事を表示

RailsでChatGPT(OpenAI API)を使ってみる

:::note info
**この記事のポイント:** Ruby on RailsアプリにChatGPTの出力を組み込んでみました。APIを叩けるか試してみるのが主目的で、アプリの機能(使い道)の提案としては大したものではありません。
:::

:::note warn
一部有料の内容を含みます(OpenAI API利用料)
Rails初学者が学習目的で執筆しております。誤り、改善点などぜひご指摘ください
:::

# はじめに

ChatGPTをはじめとするLLM(大規模言語モデル、生成系AI)の発展により、身近なソリューションに様々な変革が起きています。自分は普段Pythonで自然言語関連のタスクを扱うことが多いのですが、最近学習を始めたRuby on Railsにおいても、LLMを組み合わせることで何かおもしろいことができるのではないかと自然に考えが及びましす。

ということで今回はRailsアプリにChatGPTの出力を表示させられるのか、その動線を確かめてみました。

### 参考にしたサイト

[Use ChatGPT API with Ruby on Rails](ht

元記事を表示

OTHERカテゴリの最新記事