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

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

【初心者向け】失敗から学ぶ外部キー制約

# はじめに

私は1年以上稼働しているシステムを運用しているエンジニアです。
今回は私がDB設計で失敗し外部キー制約について学んだことを記事にします。
少しでも皆さんの参考になれば幸いです。

# こんな人に読んで欲しい

– DB設計をしている
– DB設計を勉強中
– 外部キー制約について学びたい
– 運用中のテーブルに変更をかけたい

# 目次

– 皆さんにお伝えしたいこと
– 概要
– 失敗事例
– 間違った設計
– バグ調査
– 正しい設計
– 失敗から学んだこと
– まとめ

# 皆さんにお伝えしたいこと

まず初めに、エンジニアの皆さんにお伝えしたいことは漏れなくテストしよう!!!です。
いきなりなんだ??と思うかもしれませんが、結局本記事で最も伝えたいことはこれなので先にお伝えしました。
それでは概要をお伝えしていきます。

# 概要

## システム概要

登録した利用者情報を管理するシステムです。
利用者(エンドユーザー)はフォームから各情報を入力し、登録します。
管理者(クライアント)は管理画面から利用者情報を

元記事を表示

【Rails】絶対理解できる!検索機能のransack【ransackこれから覚える人に届け!】

# ransackとは
様々な’モデルテーブルのカラム(縦列)’を用いて、様々な’検索’が出来ます。
検索機能としてよく使われているので、お使いの際はインストールしてください。
こちらでは理解する事を目標にしているのでインストールは他の記事読んでください。
他の皆様の記事はこれに装飾したり他の機能を組み込んだりして、
ノイズ混じりで説明してくれています。
これは純度100%のransack記事です。
自分が調べるときこういうの誰か書いとけよって思った内容です。
## controllerの書き方
“`ruby
def index
@q = モデル.all.ransack(params[:q])
@モデル = @q.result
end
“`
index下で一番簡潔に書くとこうだと思います。
@モデル = モデル.allがこうなります。
これをめちゃめちゃ分かりやすく説明します。
日本語訳します。
@qと:qのqはquery(質問)の略で、paramsは見つけてくるメソッド、
ransackは盗む、resultは結果、=は定義するという

元記事を表示

Docker+Rails7+Mysqlの環境構築やってみた

# Docker

## Dockerとは
Dockerは、「**コンテナ型の仮想環境を作成、共有、実行するためのプラットフォーム**」です。

### コンテナ is 何?

**コンテナとは**
* Dockerエンジンの上に立つ一つの箱
* 箱の中には特定したもの
* コンテナに何を入れるか、を考える

### 簡単に言うと、マシン内の入れ物に任意のものを入れられる便利な箱!!

# 作ってみた!
### 任意のディレクトリを作成
“`shell
mkdir rails_docker && cd rails_docker
“`

### 必要ファイルの作成
“`bash
touch {Dockerfile.dev,compose.yml,.env,Gemfile,Gemfile.lock,entrypoint.sh}
“`

* Dockerfile.dev(DockerfileをDockerfile.devという名前で作成)
* compose.yml
* .env
* Gemfile
* Gemfile.lock
* entrypoint.sh

###

元記事を表示

Railsで多対多の関係を扱う – Part 4: Railsの多対多関係におけるページネーションと順序指定の問題解決

## 前回までの記事
https://qiita.com/KM9973/items/9072aa1f0c43284e536d

https://qiita.com/KM9973/items/9ac44032e1918bbc8b35

https://qiita.com/KM9973/items/85c9861623dc18faeecf

## はじめに
多対多の関係を持つモデル間でデータを取得し、それを一定の順序でページネーションする場合、特にRailsでは複雑な問題に直面することがあります。本記事では、具体的な問題点とその解決策を、実際のコードを用いて詳しく解説します。

## 問題の発生
例として、`Service`と`Category`が多対多の関係にあり、関連する`Category`の名前で`Service`をソートしたい場合を考えます。以下のようなコードでデータを取得しています。

“`ruby
@services = current_company.services
.includes(:categories)

元記事を表示

Railsで多対多の関係を扱う – Part 3: Eager Loadingを避けるべき場面と最適化戦略

## 前回までの記事
https://qiita.com/KM9973/items/9072aa1f0c43284e536d

https://qiita.com/KM9973/items/9ac44032e1918bbc8b35

## はじめに
前回は `includes` と `joins` の使い分けについて詳しく解説しました。今回は、Eager Loading(事前読み込み)を避けるべき場面と、データ取得戦略を最適化するためのテクニックに焦点を当てます。

## Eager Loadingを避けるべき場面
Eager Loadingは多くの場合に便利でパフォーマンス向上に寄与しますが、すべてのシナリオで最適なわけではありません。以下は、Eager Loadingを避けた方が良い場面です。

1. **大量の関連データがある場合**:
– 関連データが非常に多い場合、事前にすべてを読み込むとメモリ使用量が大幅に増加し、アプリケーションのパフォーマンスが低下する可能性があります。例えば、一つの親レコードに対して数千から数万の子レコードがあるような場合、必要なデータだけを選

元記事を表示

Railsで多対多の関係を扱う – Part 2: `includes` と `joins` の使い分け

## 前回までの記事
https://qiita.com/KM9973/items/9072aa1f0c43284e536d

## はじめに
前回の記事で、Railsで多対多の関係を持つモデルの設定と基本的なデータ取得方法について説明しました。今回は、`includes` と `joins` の違いに焦点を当て、これらのメソッドをいつ、どのように使い分けるべきかを詳しく見ていきます。

## `joins` メソッドの基本
`joins` はSQLの `INNER JOIN` を使ってテーブルを結合し、関連するデータを取得するために使用します。しかし、`joins` だけでは関連テーブルのカラムは自動的には選択されません。これが意味するのは、関連データにアクセスしようとした場合、追加のクエリが必要になることです。

“`ruby
@services = Service.joins(:categories)
“`

このクエリは `services` と `categories` を結合しますが、`Service` オブジェクト内で直接 `Category` のデータにアクセスする

元記事を表示

Railsで多対多の関係を扱う – Part 1: モデル設定と基本のデータ取得

## はじめに
多対多の関係は、Webアプリケーションのデータモデリングで頻繁に遭遇するパターンの一つです。Rails では `has_many :through` アソシエーションを利用して、この種の複雑な関連を簡単に扱うことができます。本記事では、`service` と `category` の多対多の関係を例に、Rails でのアプローチとSQLクエリの両方を通じて、データの効率的な取得方法を解説します。

## モデルの設定
まず、`service`、`category`、`service_category` の三つのモデルを設定します。以下のように各モデルに適切なアソシエーションを設定することから始めます。

“`ruby
# app/models/service.rb
class Service < ApplicationRecord has_many :service_categories has_many :categories, through: :service_categories end # app/models/category.rb class

元記事を表示

2回目のチーム開発!【アプレンティス】

# はじめに
私は、現在アプレンティス(若手エンジニアの育成・マッチングサービス)に参加しているエンジニア未経験の24歳です。
今回は、2回目のチーム開発についてまとめていきます。
今回のテーマは、**『ワクワクするものを開発せよ』** ということで前回とは違ったテーマのアプリになっています!

## アイデア決め
まずはチームメンバーで各自アイデアを出しました。
私は過去に調理師をしていた経験から、「みんなでキロクごはん」という作った料理を共有するアプリなどを考えましたが、わくわくにはかけており・・・
他のチームメンバーが考案した、「ハッピーバーふぅデイ」という、誕生日ケーキのスタンプみたいなものが表示されて、画面に向かって「ふぅーっ」と息を吹きかけるとろうそくの火が消えるアプリは、とてもワクワクして面白かったのですが、現実的に厳しく断念。
そんな中、今回作るアプリが決まりました!
それは・・・**「ジョジョ立ち倶楽部」** です!

## アプリの概要
– ジョジョ立ち倶楽部は、有名な漫画およびアニメシリーズ「ジョジョの奇妙な冒険」に登場するキャラクターたちのポーズである「ジ

元記事を表示

Railsチュートリアル6章学習まとめ

## 6.1Userモデル
Ruby on Railsでは、モデル(Model)とはデータモデルを指し、これはMVC(Model-View-Controller)の「M」です。Railsはデータの永続化にデータベースを使用し、データベースとのやりとりはActive Recordというライブラリを通じて行われます。Active Recordを使用すると、データの作成、保存、検索が可能で、これを行う際にSQL(Structured Query Language)を意識する必要はありません

さらにマイグレーションという機能がある為SQLについて学ぶ必要はないんですね。

とはいっても今までチュートリアルの言われるがままにマイグレーションをやってきました。
マイグレーションって一体なんなのか、咀嚼していきたいと思います。

## 6.1.1データベースのマイグレーション
ユーザークラスと同様に、nameとemailの2つの属性を持つユーザーをモデリングするところから始めるとのこと。

“`
class User
attr_accessor :name, :email
.
.

元記事を表示

Railsにける50音順ソートの実装

## はじめに

50音順でカテゴリを並べてページネーションを行う場合は、`sort_by` メソッドを使って配列に変換した後、`Kaminari.paginate_array` メソッドを使ってページネーションを行う。

### 最終的な解決策
“`ruby
sort_order = params[:sort] == ‘desc’ ? :desc : :asc
@categories = current_company.categories.order(name: sort_order).page(params[:page]).per(10)
“`

## 試行錯誤の過程

### 1. データベースレベルでの50音順並べ替えの試み

最初に試したのは、PostgreSQLの機能を利用して50音順に並び替えを試みる方法。

“`ruby
# コントローラー
@categories = current_company.categories.order(‘name COLLATE “ja_JP.utf8″‘).page(params[:page]).per(10)
“`

また

元記事を表示

【Rails】Dockerを利用したアセットプリコンパイルを設定する(Asset Pipeline)

# はじめに
本記事は、私が個人開発を行う中で、アセットプリコンパイルを適切に実行するまでに多大な時間を要してしまったので、今後自分自身が迷わないにするためという備忘録、さらには同じような境遇の方のお力になれればと思いを込めて記事にしたいと思います!!

# 基本概念のおさらい
まずは、ざっくりと、アセットプリコンパイルに関しての基本をおさらいします!

### そもそも、アセットプリコンパイルとは?
複数のアセットファイル(JavaScriptやCSS)を圧縮して連結することで一つのファイルにまとめること。
### アセットプリコンパイルをすると何が嬉しいの?
– アセットプリコンパイルにより、ウェブページの読み込み速度が向上するので、UXやSEOの改善が期待される
– キャッシュやバージョン管理の面でもメリットがある

### そもそも、「アセット」って具体的に何よ?
Railsにおける、「アセット」とは画像、CSS、JavaScriptファイルなどの静的ファイルのこと。

### アセットプリコンパイルの流れ
– 結合と圧縮:
– アセットプリコンパイラ(Sprocke

元記事を表示

railsとvue.jsを使用してchatアプリを作ってみた

#### 環境
– ruby 3.1.4
– rails 7.0.8.1
– vue 3.4.21

#### 事前準備

workspaceという作業環境を構築
バックエンドとフロントエンドで作業環境を分けた。

– 使用したライブラリ
rails
“rack-cors(クロスドメイン対策)“
“ActionCable(標準用意されている。サーバ側からクライアントに直接情報)“
vue.js
“axios(HTTPリクエストで使用)“
“vue-router(ルーティング処理)“
“actioncable“

#### バックエンド側

– データベースモデル
“`ruby:schema.rb
ActiveRecord::Schema[7.0].define(version: 2024_04_17_075212) do
create_table “messages”, force: :cascade do |t|
t.text “content”
t.string “sender_name”
t.integer “r

元記事を表示

RailsでBootstrapを使ってフラッシュメッセージを表示し、自動で消す方法

## はじめに
Railsのアプリケーションにおいて、ユーザー操作に対するフィードバックは非常に重要です。この記事では、Bootstrapを利用してフラッシュメッセージをスタイリッシュに表示し、JavaScriptを使用して一定時間後に自動的に消去する方法を紹介します。

### 必要なもの
– Rails 6.0 以上
– Bootstrap 4.5.2
– Webpacker(JavaScriptの管理に)

## 実装手順

### 1. Bootstrapのセットアップ
まずは、BootstrapをRailsプロジェクトに導入します。以下のコマンドでBootstrapとその依存ライブラリをインストールします。

“`bash
yarn add bootstrap@4.5.2 jquery popper.js
“`

### 2. スタイルシートの設定
`app/assets/stylesheets/application.css` を `application.scss` にリネームし、Bootstrapのスタイルシートをインポートします。

“`scss
@import

元記事を表示

RailsでCanCanCanを使った権限管理: スタッフは自分のデータのみ編集可能

## RailsでCanCanCanを使った権限管理

## 導入
Railsアプリケーションにおいて、ユーザーによって操作できるデータを制限する場合、`CanCanCan` は非常に有力なツールです。このガイドでは、`Staff` モデルが自身のデータのみを編集できるようにする設定方法を紹介します。

## 前提条件
この設定を行う前に、`CanCanCan` ジェムがアプリケーションにインストールされていることを確認してください。

“`bash
gem ‘cancancan’, ‘~> 3.0’
“`

そして、`bundle install` を実行します。

## Ability クラスの設定
`CanCanCan` は `Ability` クラスを使用して、誰が何をできるかを定義します。`Staff` が自分自身のプロファイルのみ更新できるように設定しましょう。

“`ruby
# app/models/ability.rb
class Ability
include CanCan::Ability

def initialize(user)
user

元記事を表示

Playwright + Github Actions で CI上の local Web 環境に E2Eテストを実行する例 ( フロント + バックエンドAPI構成 )

# 課題

Github Actions で Playwright の E2E テストを実行するにはどうすれば良いか?

対象環境はGithub Actions 上の local 環境とし、毎回データベースはリセットして、実行単位ごとに依存しないテストがしたい

# 概要

たとえばサービスがフロント+バックエンドAPI構成の場合、特に変わったことをする必要はなく、以下の手順で実現できる

– データベースサーバーを起動する
– 初期データベースや初期データ ( seed ) を作成する
– バックエンドAPIサーバーをバックグラウンド起動する
– フロントをバックグラウンド起動する
– 起動済みのフロント ( localhost ) に対してPlaywright を実行する

起動したサービス同士は すべて localhost ( 127.0.0.1 ) で接続し合うことが出来る

# Github Actions Workflow の例

– 1個のジョブ ( jobs ) を使って直列的にワークフローを実行する。( 自分が試した中だとジョブを複数個に分けると環境が分離してし

元記事を表示

【Rails】ActiveStorageにバリデーションを設定する方法

## Gemをインストールする

`active_storage_validations`をインストールします。

https://github.com/igorkasyanchuk/active_storage_validations

“`rb:Gemfile
gem ‘active_storage_validations’

# :dimension または :aspect_ratioを使用する場合には以下のいずれかを併せてインストールします。
gem ‘mini_magick’, ‘>= 4.9.5’
gem ‘ruby-vips’, ‘>= 2.1.0’

“`

“`terminal:ターミナル
bundle install
“`

## バリデーションを設定する

モデルにバリデーションを記述します。

“`app/models/user.rb
class User < ApplicationRecord has_one_attached :avatar validates :avatar, content_type: { in: %w[image/

元記事を表示

【個人開発】チーム開発して最新技術に乗り換えた話【Next.js Rails】

## 目次

1. 結論
2. ターゲット
3. 筆者経験
4. 個人開発 vs チーム開発
5. どう変わったか
6. 技術アップデートの背景
7. アップデートのpros & cons
8. 技術に興味がある人向け
9. 結論

## 結論

:::note info
力を付けて結果出すなら**チーム開発**!
:::

## ターゲット

– 個人開発に興味があるエンジニア
– 新しい技術を学びたい人

## 筆者経験

個人開発特化Webアプリ ideee(アイディー)の制作者

“`
アイデアのブラッシュアップができる
面白いアイデアに出会える
“`

https://ideee.tech/about?utm_so

元記事を表示

統合テストのエラー解決

## 問題
統合テストを実行したら以下のエラーが生じた。
“`
ERROR SiteLayoutTest#test_layout_links (0.22s)
Minitest::UnexpectedError:NoMethodError: undefined method `body’ for nil:NilClass

response.body

^^^^^
test/integration/site_layout_test.rb:7:in `block in
“`

`test/integration/site_layout_test.rb:7`が指摘されている。

“`ruby:
require “test_helper”

class SiteLayoutTest < ActionDispatch::IntegrationTest test "layout links" do assert root_path assert_template 'articles/index' # ここでエラーが発生

元記事を表示

Railsのテストで、Could not find tableエラーを解決する方法

# 概要

Railsのテストを実行した際に、Could not find table というエラーが起きる場合があります。

本記事では、このエラーがなぜ起きるのか、どう解決するのかを解説します。

# この記事で伝えたいこと

– Could not find tableのエラーが起きる理由
– Could not find tablエラーを解決する方法

# 実行したテスト

ユーザインスタンスを作成し、ユーザが有効かどうか検証する。

“`ruby
class UserTest < ActiveSupport::TestCase # 事前に、ユーザインスタンスに名前等の各値を設定する # setupメソッドは、テスト実行時に自動で実行される def setup @user = User.new(name: "Emi", email: "emi@a.com", password: "fooooo", password_confirmation: "fooooo") end test "should be valid" do assert @

元記事を表示

ページを更新しないとform_withのボタンが押せない

rails6.1の環境でform_withを使った情報入力フォームを作成したときのことです。

フォームに付けた <%= f.submit '送信', class: "btn btn-info" %>のボタンをクリックしてもページ遷移せず、ページを更新したらなぜか押せるようになるという現象が起こっていました。

どうしてだろうと思い、form_withについて調べたり、
urlが違うのか?とか、単語を打ちミスしてるのか?とか
思いながら原因を探っているとすごく単純なミスを見つけました。

こちらが不具合が出ていた時の記述です。

“`html

注文情報入力

<%= form_with model: @order, url: '/orders/confirm' do |f| %>

支払方法

<%= f.radio_button

元記事を表示

OTHERカテゴリの最新記事