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

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

【Rails】find_eachで大量データを扱う

# この記事で言いたいこと
大量データのループ処理を扱う際には`find_each`がメモリ節約に有効である。

# きっかけ
先日、Ruby on Railsで大量データを扱う機会がありました。
その際`find_each`というメソッドがあることを学んだので、`each`との違いを明らかにしながらまとめていこうと思います。

# eachを用いた例
`Student`というモデルがあると仮定します。
studentsテーブルにある生徒の名前(nameカラム)を全員分出力したい場合、皆さんはどのようなコードを書きますか?

“`ruby
Student.all.each do |student|
puts student.name
end
“`

上記のように`Student.all`でレコードを全件取得してから`each`メソッドを使用することで、studentsテーブルにいるすべての生徒の名前を出力することができます。

レコード数が少ない場合は上記の例のように書くのがよいでしょう。
しかしレコードが大量にある場合は、上記のようにレコードを一気に取得する方法だとメモリ

元記事を表示

かんたんLINE botをつくろう!【クイズをつくる】

# はじめに

前回記事で物足りなかった方向けの記事です。

https://qiita.com/kohki_takatama/items/88927cf75ae1a5f683f2

## 課題:`postback`を使用してクイズを3問つくる

こんな課題を、前回記事の最後に出しました。
その解答例を載せておきます。

# 解答例

ヒント

`postback`を使うメリットは、
– `message`と違い、(非正規の)ユーザー操作で呼び出すことができない
– 「正しい回答」と「間違った回答」で処理をまとめられること(問題を増やしたときに、同じ処理を繰り返し書かなくてすむこと)

です。

特に、「正しい回答」と「間違った回答」で処理をまとめられること
これを実現してみてください。

条件分岐には、すでにあるものが使えます。
`def callback`の中の、`case event ~ when Line::Bot::Event::Message ~`を拡張しま

元記事を表示

RailsのModelで定義したenumの対応関係を確認する

## 背景
enumを設定したはいいものの、
一定数を超えると数字と文字の対応関係がわかりにくくなると思います。

そんな時にconsoleでパッと確認できますよ〜という内容です。

## 確認方法
まず、例として次のようなUserモデルがあるとします。

“`ruby
class User < ApplicationRecord enum :status, [ :active, :inactive, :suspended # ...省略 ] end ``` このモデルで定義されたstatus enumの数値と文字列の対応関係を表示するには、 rails consoleで以下のコマンドを実行します。 ```ruby User.statuses ``` これにより、以下のような出力が得られます。 ``` { "active" => 0,
“inactive” => 1,
“suspended” => 2,

}
“`

めでたし*2。

元記事を表示

【Rails】Youtube APIを使ってIDで動画を検索する

# はじめに
この記事では学習中に出会ったエラーとその解決までの道のりを自分のために記録しています。
初学者のため、理解が不十分なところがあるかもしれません。
その場合はご指摘いただけると幸いです。

# やりたいこと
YouTubeの動画IDから動画情報を検索し、タイトル・概要欄・サムネイルを取得する

# 準備
– APIキーの取得
– APIキーを環境変数に設定
– YouTube Data API v3を使うためのgemをインストール

この3つを準備していきます。

## APIキーの取得
– Google Cloud Consoleにログイン
– 新しいプロジェクトを作成

![77772AA8-87F8-4842-93B5-FAAF741B9554_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671013/b59aafd9-fba9-448f-e181-76b62371327a.jpeg)

– 使用するAPIの有効化

**APIとサービス**の**ライ

元記事を表示

かんたんLINE botをつくろう!【Rails 応用編】

# はじめに

前回記事で作成した、以下のコードを改造していきます!

https://qiita.com/kohki_takatama/items/278b1f47e355e08df43a

“`ruby
class LinebotController < ApplicationController def callback body = request.body.read events = client.parse_events_from(body) events.each do |event| case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: event.message['text'] }

元記事を表示

【Rails API】rack-corsでレスポンスヘッダーにアクセスできるようにする方法

`rack-cors`をインストールして`config/initializers/cors.rb`の`expose`を記述することでJavaScriptからレスポンスヘッダーにアクセスできるようになります。

“`rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ‘localhost:3000’

resource “*”,
headers: :any,
methods: %i[get post put patch delete options head],
expose: %w[X-Sample],
credentials: true
end
end
“`

上記の場合には`X-Sample`にアクセス可能になります。

https://github.com/cyu/rack-cors

元記事を表示

collectionオプション

collection オプションは指定したインスタンス変数の中にある要素の数だけ、部分テンプレートを呼びだすことができる。
collectionを使えば繰り返し表示させたい要素がインスタンス変数に複数入っている場合でも`each`メソッドを使わず`render`で繰り返し表示できる。

## collectionを使う場合
“`ruby
<%= render partial: 'hoge', collection: @hoges %>
“`
collectionを使用する際は、複数要素が入っているインスタンス変数を、collectionオプションの対象に指定する。部分テンプレート内では、インスタンス変数から取り出した要素を、部分テンプレート名と同じ変数名で扱うことができます。
つまり、_hoge.html.erb内において、@hogesから取り出された1つ1つの要素はhogeとして扱うことができます。

## eachを使う場合
“`ruby
<% @hoges.each do |hoge|%>
<%= render partial: 'hoge', lacals: {hog

元記事を表示

【Rails】指定したマイグレーションのみやり直す方法

マイグレーションをやり直したいファイル名:db/migrate/20240227224617_sorcery_reset_password.rb
“`
docker compose run web rails db:migrate:redo VERSION=20240227224617
“`

### 参考
https://mintaku-blog.net/rails-redo/

元記事を表示

【Rails】パスワードリセット機能を実装する

## 実装の流れ
1. sorceryのReset passwordモジュールをインストールする
1. Mailerの作成
1. コントローラの作成
1. トークンにユニーク制約を付与
1. ビューファイルの作成
1. letter_opener_webの導入
1. configを導入

公式wikiに手順が説明されている。
https://github.com/Sorcery/sorcery/wiki/Reset-password

## sorceryのサブモジュールをインストール
“`
$ rails g sorcery:install reset_password –only-submodules
“`
以下のファイルが生成される。
config/initializers/sorcery.rb
app/models/user.rb
db/migrate/20231105121233_sorcery_reset_password.rb

しかし私の場合、app/models/user.rbでエラーのような文が表示された。
“`
gsub config/initializ

元記事を表示

かんたんLINE botをつくろう!【Rails編】

# はじめに

前回記事はこちら

https://qiita.com/kohki_takatama/items/e19960e479a712d63408

1. LINE botをつくろう!ノーコード編
2. LINE botをつくろう!Rails編 👈今ココ
3. あれって、何してたの?会(イベント内のみで、2次会的に開催)

[【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した #Ruby – Qiita](https://qiita.com/KNR109/items/e1b5ebd94393441fff74)
こちらの記事を大きく参考にさせていただきました!ありがとうございます!
# 2. LINE botをつくろう!Rails編

ここからはアドバンスな内容です。

# 2-1. ngrok の設定

LINE botのテストに必要な、ngrokというサービスのアカウントを作成します。
簡単に言うと、ローカルな(自分の手元の)プログラミングコードに外部からアクセスできるようにするサービスです。

## 2-1-1. ngrokにアクセス

https

元記事を表示

Redmineをv1.4からv5.1へアップグレード

最近、とあるお仕事で長年運用してきたRedmine v1.4をRedmine v5.1へアップグレードしました。
Redmineの構築は約10年ぶり。作業しながらだんだん思い出してきましたが、Redmineのインストールはとても面倒です。Redmineの、というよりは、Ruby on Railsベースのアプリの、というほうが正しいのかもしれませんが。
作業のログを残しておきます。

# 要件

* __OSのEOSL対応__。元々Redmineを運用してきたサーバーのOSのEOSL対応が必要なため、別途新しくサーバーを用意してRedmineをインストールする。
* __基盤をさくらのVPSからAWSへ移行__。構築や運用における様々な利便性を考慮し、新しいサーバーOSはAWS上に構築する。
* __旧環境のデータを新環境へ移行__。旧環境のRedmineからデータベース内の全データとディスク上の添付ファイルを移行する。
* __DBもEOSL対応__。OS同様にEOSL対応が必要なため、新しいサーバー上に最新のMySQLをインストールする。
* __RDS化やコンテナ化はなし__。移行

元記事を表示

ActiveStorageの合計サイズのバリデーションをかけるには?

複数のActiveStorage とモデルを紐づける `has_many_attached :files` フィールドの合計サイズでバリデーションをかけるのにはまりました。

## 削除フラグに対応した以下のようなフィールドを定義しているケースです
“`ruby:some_model.rb
has_many_attached :files
accepts_nested_attributes_for :files_attachments, allow_destroy: true
“`

## 以下のように書いてませんか?

安心してくださいうまく動きません。
削除予定のファイルも含めてサイズが計算されてしまいます。

“`ruby:some_model.rb
validate :validate_total_attachments_size
def validate_total_attachments_size
total_size = 0

files.each do |file|
total_size += file.byte_siz

元記事を表示

【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

元記事を表示

bundle install実行時に”An error occurred while installing pg (1.5.6), and Bundler cannot continue. “って出る時

## 概要
“`
$ rails new アプリ名 –database=postgresql
“`

“`
$ bundle install
“`
などを実行した際にタイトルのエラー文に遭遇しました。

エラー文からわかる通り、「Railsのposgresql用のgemをインストールしている最中にエラーが発生しました」ということだとは思うのですが、ネット記事などで似たようなケースがあまりなく、類似の記事でも原因が自分のケースと全然違うようだったのであまり参考にならなそうですが自分のケースを備忘録的に書いてみました。

## やったこと

“`
$ brew services list
“`

mysql none
postgresql@14 started
と表示されていたので、動いている状態でした。

##### 最初から確認してみた

pg_config –version などのコマンドを実行して、PostgreSQLがインストールされているかを確認します。
“`
$ pg_config –version
=> PostgreSQL 14.11(Home

元記事を表示

【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)

最新版のRubyをGemini先生に助けられながらインストールする

※参考:[【Ruby】最新版Rubyをインストール 〜苦戦の記録〜(ありがとうGemini先生)](https://www.i-ryo.com/entry/2024/03/26/225903)

元記事を表示

GitHub Actionsを活用して自動デプロイを導入する方法

# 概要
この記事では、GitHub Actionsを使用してRailsアプリケーションをAWS EC2インスタンスに自動デプロイする方法を解説します。このプロセスには、秘密鍵の生成、GitHubに秘密鍵を保存、Capistranoでのデプロイ設定が含まれます。

# 環境
*Ruby 3.2.0
*Rails 7.0.8
*Capostrano 3.18.0
*EC2

※前提として、Capistranoの実行に必要なGemや設定などは導入済みであるものとします。通常はローカル上でbundle exec cap production deploy コマンドを実行するものとします。また、CapstranoはSSH接続ができることを前提としています。

# 参考リソース
https://qiita.com/o-y/items/38f31996cfd04b642899

# 公開鍵・秘密鍵の作成
SSHキーを生成して、サーバーとGitHubの間で安全な通信を確立します。

“`
ssh-keygen -t rsa -b 4096 -f ~/.ssh/[鍵の名称]
“`
# 公開鍵の

元記事を表示

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

# 初めに

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

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

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

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

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

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

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

元記事を表示

Dart Sass for Railsのビルドオプションの設定方法

Dart Sass for Railsのビルドオプションの設定方法ですが

[公式ドキュメント](https://github.com/rails/dartsass-rails)には以下のように記載されています。

> ## Configuring build options
> By default, sass is invoked with [“–style=compressed”, “–no-source-map”]. You can adjust these options by overwriting Rails.application.config.dartsass.build_options.
> “`ruby:config/initializers/dartsass.rb
> # config/initializers/dartsass.rb
> Rails.application.config.dartsass.build_options << "--no-charset" << "--quiet-deps" > “`

ところが以下のようにエラーが出ます
`

元記事を表示

Railsのおすすめボイラープレート

こんにちは!学びと成長しくみデザイン研究所の斉藤です。
みなさんはRails環境での技術検証をしたいとき、手っ取り早く試せるRails環境を作りたいと考えたことはありませんか?
例えば、「gemの動作検証をしたい」や「古いRailsの挙動を調査したい」など。
`rails new` で一から環境構築するのは少し手間だし、どうしようかと思っていたところ、素晴らしいOSSを見つけたのでご紹介します。

## オススメ1

https://github.com/yasslab/sample_apps

Railsチュートリアルのサンプルコード集です。ボイラープレートとしても活用できます。

– おすすめポイント
– Railsの古いバージョンから新しいものまで幅広くカバーしている
– 癖のあるgemが導入されておらず、素のRailsに近い構成
– 補足
– DBがSQLiteなので、本番環境のDBと合わせたい場合は以下の記事を参考にどうぞ
– https://qiita.com/SaitoJP/items/d0df0ff431ee184b895b

元記事を表示

OTHERカテゴリの最新記事