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

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

【Rails・デザパタ】マイグレーションで学ぶCommandパターン

## Commandパターンとは
Commandは「命令」という意味で、「命令」をオブジェクトに表したデザインパターンです。命令オブジェクトごとにステータスを保持されることで、複数のコマンドの履歴管理や、複数の命令をまとめて実行・ロールバックすることが容易になります。

## Rails の ActiveRecord での Commandパターン
`Rails` の `ActiveRecord` のマイグレーション機能ではテーブルを追加したり、カラムの変更を行うことができます。本来はSQLを直接実行することでDBに変更を加えますが、マイグレーションは専用のスクリプトファイルを用意し、それを実行します。

## マイグレーションの基本動作

マイグレーションファイルの作成はコマンドで実行することができます
“`terminal
rails generate model Cat name:string age:integer
“`

“`db/migration/20240315_create_cats.rb
class CreateCats < ActiveRecord::Mi

元記事を表示

【Rails】ネストされた関連オブジェクトのレンダリング問題とその対処法

## 概要

`Rails` で `API` を開発する際に、`ActiveModelSerializers` のバージョン `0.10.x` を使用しているとネストされた関連オブジェクトをレンダリングできないという問題に直面しました。この問題は、`render` メソッドで `include` オプションを明示的に指定することで解決できます。

## 原因

`ActiveModelSerializers` のバージョン `0.10.x` では、デフォルトでネストされた関連オブジェクトの自動レンダリングがサポートされていません。これにより、期待通りにネストされた `JSON` を返却するために追加の手順が必要になります。

## 対処法: `include` オプションの使用

期待通りにネストされた `JSON` レスポンスを生成するためには、`render` メソッド内で `include` オプションを使用して、明示的にネストされたオブジェクトを指定する必要があります。以下は、店舗情報とその関連オブジェクトをレンダリングする `Rails` コントローラーの実装例です。

元記事を表示

Ryby/Ruby on Railsを習得するためにやったこと まとめ(随時更新)

バックエンド言語「Ruby」およびWebフレームワーク「Ruby on Rails」を習得するためにやったことをここにまとめます。随時更新中!!

RubyもインストールしてHello worldしてみる。

※参考:[初めてのRuby:インストール確認、REPL、Hello worldまで](http://idr-zz.hatenablog.com/entry/2018/11/20/224131)

6年ぶりのRyby再開計画発動!!Rubyistに、俺はなる!?

※参考:[Rubyistに、俺はなる!? 6年ぶりのRyby再開計画発動](https://www.i-ryo.com/entry/2024/03/24/201632)

元記事を表示

マイグレーションとmerge の関係性

マイグレーションに記入した
“`ruby
class CreatePrototypes < ActiveRecord::Migration[7.0] def change create_table :prototypes do |t| t.string :title t.text :catch_copy t.text :concept t.references :user, null:false, foreign_key: true t.timestamps end end end ``` 上記の通り `t.references :user, null:false, foreign_key: true` を記述すると ストロングパラメーターに`merge`を付けることを忘れずにする!!これをせずにいるとうまく遷移できなかった。 具体的に ```ruby private def prototype_params params.require(:photo).permit(

元記事を表示

最適なデータベース設計とは

# 初めに

バックエンドエンジニアとしてそれなりに仕事をしているので、度々データベースのパフォーマンスを調査する事がある。この機会に、最適なデータベースとは何なのか一度棚卸ししたいと思い、データベース設計のベストプラクティスを見直してみた(ついでに社内でRailsを触れているのでデータベース設計も軽くRailsで書いた)

# 最適なデータベース設計とは

データベースの正規化とパフォーマンスのバランスは、データモデリングにおいて非常に重要なテーマです。この記事では、商品管理データベースを例に、Railsを使用して次の2つの異なるアプローチでテーブルを作成する方法を紹介します。

1. **正規化が適正なテーブル作成** – データの整合性と再利用性を最大化する
2. **パフォーマンスが優先のテーブル作成** – クエリの速度と効率を最大化する

### **1. 正規化が適正なテーブル作成**

正規化は、データの重複を避け、整合性を保つために行います。商品管理データベースでは、以下のようにテーブルを設計します。

– **`products`** テーブル: 商品ID、商品名、

元記事を表示

AtCoder Unit Test が新しくなりました!

AtCoder の問題ページからユニットテストを生成するブラウザ拡張機能 “AtCoder Unit Test” を大幅リニューアル!便利な新機能をいろいろ実装しました!

* **テストコードのテンプレートが編集できるようになりました。**
* **テストコードの生成方法が変更になりました。**
* Go, Ruby のテストコードを生成できるようになりました。
* (Python) テストコードを含んだまま提出できるようになりました。 ([例](https://atcoder.jp/contests/abc341/submissions/51385551))
* (Java, Kotlin) テストライブラリが JUnit5 に変更になりました。

ダウンロードは ↓ から。ぜひご利用ください!!!

* [AtCoder Unit Test – Chrome ウェブストア](https://chromewebstore.google.com/detail/atcoder-unit-test/lmahhninbclefepjbcdfbcjnancipfmi?hl=ja&auth

元記事を表示

rails testしたら “Migrations are pending. …” とか出る

# はじめに
最近、Railsを触り始めました。
転職先で使用するかもしれないので学習するためにはじめてます。
(この時はまだ決まってない。この先も決まらない…かも…しれない :relaxed: )

今回は自分が遭遇したエラー対応の備忘録として書いてます。

# 環境
* Ruby 3.2.3
* Rails 7.1.3
* SQLite3 1.4

## `rails test` したら、’Migrations are pending.’ と出る

`rails test` コマンドを実行しようとしたら、以下のエラーが出る。
“`terminal
C:\Users> rails test
Migrations are pending. To resolve this issue, run:

bin/rails db:migrate

You have 2 pending migrations:

db/migrate/20240227131218_create_users.rb
db/migrate/20240302042818_create_micropost

元記事を表示

【Railsチュートリアル】第11-14章 まとめ

## 第11章
### コンソールの改行
“`ruby:ターミナル

rails generate migration add_activation_to_users \
> activation_digest:string activated:boolean activated_at:datetime

“`

### メーラーの生成
“`ruby:ターミナル

rails generate mailer UserMailer account_activation password_reset

“`

### メールを即時送信
“`ruby:app/controllers/users_controller.rb

UserMailer.account_activation(@user).deliver_now

“`

### メッセージを渡し、動作させる
“`ruby:app/models/user.rb

digest = self.send(“#{attribute}_digest”)

“`

### コントローラのアクション内で定義された変数をテストで使

元記事を表示

【Railsチュートリアル】第6-10章 まとめ 

## 第6章
### データベースを変更しないようにコンソールを使う
“`ruby:コンソール

rails console –sandbox

“`

### オブジェクトが有効化を確認
“`ruby:コンソール

>> user.valid?
true

“`

### データベースにオブジェクトを保存
“`ruby:コンソール

>> user.save

“`

### オブジェクトの生成とデータベースへの保存
“`ruby:コンソール

>> User.create(name: “A Nother”, email: “another@example.org”)

“`

### データベースからの削除
“`ruby:コンソール

>> foo.destroy

“`

### idからデータを検索
“`ruby:コンソール

>> User.find(1)

“`

### 値からデータを検索
“`ruby:コンソール

>> User.find_by(email: “michael@example.com”)

“`

### データベースの最

元記事を表示

【Railsチュートリアル】第1-5章 まとめ

## 第1章
### サーバー実行
“`ruby:ターミナル

rails server

“`

### ファイル確認
“`ruby:ターミナル

ls app/controllers/*_controller.rb

“`

### Gitの設定内容の確認
“`ruby:ターミナル

git config –list

“`

### 全ての変更ファイルをステージング
“`ruby:ターミナル

git add -A

“`

### 現在のステージング状態を知る
“`ruby:ターミナル

git status

“`

### ステージングされた変更内容をリポジトリに保存
“`ruby:ターミナル

git commit -m “Initialize repository”

“`

### これまでのコミットメッセージ履歴を確認
“`ruby:ターミナル

git log

“`

### 直前にコミットした状態まで戻る
“`ruby:ターミナル

git restore

“`

### ブランチを新たに作成し、移動する
“`ruby:タ

元記事を表示

【Progate】Ruby on Rails 5 まとめ

## 各コードの機能

### ターミナル
|コード|機能|
|:-|:-|
|`rails new アプリ`|入力したアプリ名と同じファイルを作成|
|`rails server`|サーバーを起動|
|`rails g controller コントローラ名 アクション名`|コントローラとそれに対応したファイルを作成|
|`rails g model テーブル名 カラム名:データ型(※テーブル名は単数系&頭大文字)`|マイグレーションとモデルを作成|
|`rails g migration`|マイグレーションのみを作成(マイグレーションの中身は自分で作成する必要がある)|
|`rails console`|コンソールを起動|
|`quit`|コンソールを終了|
|`File.write(ファイルの場所,ファイルの中身)`|指定したファイルの場所にファイルの中身を記述する|
|`bundle install`|Gemfileに記述したgemをインストールする|
|`インスタンス名.save`|インスタンスをテーブルに保存|
|`モデル名.first`|テーブルから一つのデー

元記事を表示

find_or_create_byメソッドについて

## はじめに

個人開発でOmniAuthを用いた認証機能を実装する際に、“`find_or_create_by“`メソッドの挙動について疑問が生じたので、その点について調べてみました。

:::note warn

初学者のため間違いがあるかもしれません。
その際はご指摘いただけると嬉しいです。

:::

## 元々の認証機能の一部

既存のユーザーに対して変更があった際には、updateメソッドで更新をしたかったのですが、“`user_update(user_params)“`の部分が動いていないようだったのでなぜだろうと気になりました。

“`ruby
def self.find_or_create_from_auth_hash(auth_hash)
user_params = user_params_from_auth_hash(auth_hash)
User.find_or_create_by!(uid: user_params[:uid]) do |user|
user.update(user_params)
end
end

元記事を表示

【個人開発】運動の習慣化を手助けするサービス『トレゴリ』をリリースしました🦍

# まず初めに
皆さん初めまして、[のぞみ](@muscle_gori02)と申します。
私は現在、未経験からのWEBエンジニア転職を目指して、日々学習&転職活動を行なっております。
2024年2月に、運動の習慣化を手助けするゲームフィケーションサービス『トレゴリ』をリリースしました!
**「トレゴリ?なんかゴリラに関係するアプリ何かな?」**
と思われた皆さん、ご明察です…!
今回の記事では、『トレゴリ』の具体的なサービス内容・開発のきっかけ・使用技術…などについて書きました。

少々長くなっておりますが、是非最後まで読んでいただけると嬉しいです。笑

# 自己紹介
個人開発のお話に入る前に、少し自己紹介をさせていただきたいと思います🦍
私は地元の高校卒業後、とある製造企業へ入社し生産管理部門の進行長として、約6年間社内製造の進行計画管理に携わってきました。

そんな中で色々あり、エンジニアを目指すべく昨年4月に某プログラミングスクールへ入学しました。
(経緯等については長くなってしまうので、省略させていただきます…笑)

昨年12月まで仕事と学習

元記事を表示

pry のエラーメッセージを短くする

`nokogiri`を使った処理をしてるとエラーが出たときにオブジェクトのテキスト量が多すぎてデフォルトの設定だと肝心のエラーメッセージを確認するためにコンソールを大量に巻き戻らないといけない

`Nokogiri::XML::Document`クラスのエラーでだけ表示を短くしたかったけど方法がわからなかったので例外全てを300文字以上表示しないように変えてみた。

“`.pryrc
Pry.config.exception_handler = proc do |output, exception, _|
output.puts “#{exception.class}: #{exception.message.truncate(300)}”
output.puts “from #{exception.backtrace.first}”
end
“`

もっとシンプルな解決策がありそうだけど見つからなかったので当面はこれで我慢しよう。

### 参考
https://github.com/pry/pry/wiki/Customization-and-configuration

元記事を表示

sign-up前やログイン前に記述するbefore~~

アプリのコントローラーは各コントローラー名の前にapplication_controllerを通ってから処理をしていく。

そのためbefore~~はこの`application_controller`の中に記述する。

“`ruby
before_action :authenticate_user!
“`
上記の意味は
#### ログインしていないユーザーをログインページの画面に促すことができる。

“`ruby
before_action :configure_permitted_parameters, if: :devise_controller?

private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end

“`
#### deviseを使った新規登録をする際に使用。
例えば新規登録でemail,passwordだけでなく名前を追加で新規登録させたい場合に使う。(email,passwordは

元記事を表示

Swiperのコードは階層構造になっていますか

## はじめに

Swiperを用いてトップ画像をスライダー形式に変更しようとした時に**思わぬところ**で詰まった時の話です。

## 環境

ruby 3.14

rails 7.0.3.1

swiper 11.0.7

## 用語

**スライダー形式とは**

**複数の画像がスライドのように、一定の間隔で切り替わるもの**です。ホームページのトップ画面などでよく見かけます。スライドしている画像をクリックすると、関連ページに飛べるようにも出来ます。

**Swiperとは**

jQueryプラグインの1つ。

**jQuery**とは、「表示されているページを使いやすくする」ための機能であり、**jQueryプラグイン**とは、「Webサイト作成で特定の機能が欲しいときに、jQueryと併用して利用できる」ものです。簡単な設定で導入できるとても便利なものです。

[Swiperのサイト](https://swiperjs.com/)に書いてあるコードでシンプルな実装が出来る他にも、npmや**yarn**などのパッケージマネージャーを使ってSwiperをプロジェクトにインス

元記事を表示

ruby文法復習用ノート

この記事は「こんな書き方もあったな」というのを簡単に __復習__ できるように作りました。そのため、実行結果が書いていなかったり、コード内で未定義の変数を使っていたりします。予めご了承ください。

間違い等ありましたら遠慮なくコメントください。

# 参考
[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)

# 1. 基本
– 動的型付け言語なので、型を明示的に指定はしない
– オブジェクト指向型言語なので、データをオブジェクトで表現する
– `a = 3`
– `b = “文字列”`
– nil : nullのこと

元記事を表示

Rails7.0.8でsqliteに対してchange_columnするときは必要な全ての要素を指定しよう

# 最初にざっくりまとめ
– `Rails7.0.8`で`sqlite`の`change_column`に対して変更が入った
– その影響で以前とは振る舞いが変わっている
– `change_column`で指定した要素以外の設定がデフォルトに戻ってしまう
– `mysql`では起きない(検証してないけど多分`sqlite`以外は大丈夫)

つまり、 **`Rails7.0.8`で`sqlite`に対して`change_column`するときは必要な全ての要素を指定しよう**

# 調べたこと

## `Rails7.0.8`のリリースノート
https://github.com/rails/rails/releases/tag/v7.0.8

色々と機能がリリースされていますが、今回の事象に関わるのは以下。この修正で`sqlite`の`change_column`に対して実装が追加されています。

>Fix change_column not setting precision: 6 on datetime columns when using 7.0+ Migrations a

元記事を表示

reject(&:empty?)と正規表現などを駆使して配列をいじる場合、grepが良さそう

## 課題
数字の文字列の配列として返却されるbook_idsを、整数の配列に変換し、さらに重複を除去したい。

“`book_ids.rb
[“1”, “2”, “2”]
“`

## アプローチ1
rejectメソッドを使用して空の要素を除去し、selectメソッドで数値のみを含む要素を選択し、最後にmapメソッドで整数に変換し、uniqメソッドで重複を除去する方法。

“`rb
book_ids = book_ids.reject(&:empty?).select { |id| id.match?(/^\d+$/) }.map(&:to_i).uniq
“`

こんな感じです。
ただ、このままだとパッと見何をしているかわからず、もう少し工夫できそうです。

使えそうなメソッドがないか探し、Enumerable#grepが良さそうだなと思ったので、正規表現をそのまま活用して良い感じにできないか考えてみました。
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/grep.html

## アプローチ2
grep

元記事を表示

【Ruby】paizaラーニング問題集解答(3けたごとにカンマ区切りで出力)(リベンジ)

# 大きな数値を 3 けたごとにカンマ区切りで出力 (paizaランク C 相当)
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step6

前回正答できなかった問題に再挑戦しました。
### 誤答
“`ruby:practice.rb
# 入力の受け取り
input = gets.chomp.to_s

# 出力用変数の定義
output = “”

# 出力用変数に3桁ずつ区切った文字列とカンマを追加
input.length / 3.times do |i|
output += “#{input[i*3,3]},”
end

# 末尾のカンマを除去して出力
puts output.chomp(“,”)
“`
`input.length / 3`が正しく評価されないようです。

### 正答
“`ruby:practice.rb
# 入力の受け取り
input = gets.chomp.to_s

# 出力用変数の定義
output = “”

# 出力用変数に3桁

元記事を表示

OTHERカテゴリの最新記事