Rails関連のことを調べてみた2022年10月02日

Rails関連のことを調べてみた2022年10月02日
目次

groupメソッドの応用(関連先テーブルのデータをグループ化して表示する方法)

# groupメソッドとは?

指定したカラムの各値ごとにグループ化するメソッド。

下記のテーブルから、各ownerのcatの数のデータを抽出してみる。

![20221002_ownersテーブルの画像(sex,incomeカラムとレコード数を追加).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/e9612fcb-30c4-4d06-89a9-dc456f8cd5e6.png)

![20221002_catsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/124c390f-0e08-8419-e6b4-cacd87ec2dcd.png)

(catsテーブルからowner_idごとにグループ化し、ownerごとに何匹ネコを飼っているか数え上げる)
“`
irb(main):045:0> Cat.group(:owner_id).count
(0.2ms

元記事を表示

Docker で Rails 7 + MySQL 8.0 の環境を構築する (Compose V2 対応)(M1 Mac 対応)

# 作業内容

### ディレクトリ構成
“`
myrailsapp/
├── Dockerfile
├── compose.yaml
├── entrypoint.sh
├── Gemfile
├── Gemfile.lock
└── mysql/
└── my.cnf
“`

### ファイルの準備
“`dockerfile:Dockerfile
FROM ruby:3.1.2

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN gem update –system
RUN bundle update –bundler

RUN bundle install
COPY . /app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT [“entrypoint.sh”]
EXPOSE 3000

CMD [“rails”, “s

元記事を表示

【個人用】Rails バリデーション設定〜エラーメッセージの表示

# 個人メモとして要点だけ簡潔に残します。

## バリデーションの設定
`Model` に記載

“`ruby
class Blog < ApplicationRecord validates :title, presence:true validates :content, presence:true, length: {minimum: 5} end ``` ## バリデーションのトリガーメソッド * 以下のメソッドを実行すると、バリデーションが実行される * create * create! * save * save! * update * update! ## コントローラー ### バリデーションが実行される ```ruby # POST /blogs or /blogs.json def create @blog = Blog.new(blog_params) respond_to do |format| # バリデーションがトリガー if @b

元記事を表示

[Rails]ツイッターのクローンを作ってみました。

# はじめに

Docker, Ruby, Railsの学習を終えた時点で、実践を通じて理解を深めるためのスクールの課題、ツイッターのクローンです。
機能ごとに、概要、機能の要件、工夫した点、 習ったことについて解説したいと思います!

# サービス環境
– ruby 2.6.8
– Rails 6.1.5
– docker
– mysql
– Slim, SCSS

# できるようになったこと。
– MVCの理解
– Slim,SCSSの書き方
– Devise
– ModelのValidation
– Rails-JSの繋ぎ
– ActiveRecord
– Omniauth
– ポリモーフィック関連付け
– テスト

# 目次
| |機能|
|——-|:———-:|
|1|[**ログインと会員登録(Devise)**]
|2|[**ユーザー詳細ページ作成**]
|3|[**ツイート機能&ツイートにコメント作成**]
|4|[**画像アップロード (AcriveRecord)**]
|5|[**Git Hub Login (Omniauth)**]
|6|[

元記事を表示

to_sqlメソッドでActiveRecord実行時のSQLを確認

## 1. `to_sql`を使用し、ActiveRecordのクエリを出力

“`rb:sample.rb
target_members = Member.joins(:positions).where(positions: { position_status: 5 })
puts target_members.to_sql
“`

– RSpecで任意のテストを実行すると、`putsメソッド`を使っているため標準出力に出力される

“`terminal:Run
SELECT “members”.* FROM “members” INNER JOIN “positions” ON “positions”.”member_id” = “members”.”id” WHERE “positions”.”position_status” = 5
“`

:::note warn
`pメソッド`で出力している際は出力結果に`”`(ダブルクォーテーション)のみならず`\`(バックスラッシュ)も含まれる
:::

## 2. エディタなどで置換
– 私はいつも`Visual Studio

元記事を表示

pluckメソッドの使い方と注意点

## pluckメソッド
引数に指定したカラムの値を配列で返してくれるメソッド。
使い方は下記の通り。

モデル名.pluck(:カラム名)

実際に使用してみる。
![20221001_ownersテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/efa06978-4044-0920-470e-44eae6241826.png)

(nameカラムを指定したpluckメソッドを実行し、nameカラムの値を配列で取得する)

“`
irb(main):011:0> Owner.pluck(:name)
(0.2ms) SELECT “owners”.”name” FROM “owners”
=> [“田中”, “伊藤”, “高橋”, “加藤”]
“`

また、引数を「複数」設定することで、二次元配列で値を取得することができる。

例えば、テーブルが下記の内容であったとする。

![20221001_ownersテーブルとcatsテーブルの画像.png](h

元記事を表示

[Rails] ec2上でcronを使ってrakeタスクを定期実行

## 実現したいこと
ec2にデプロイしたrailsアプリケーションでrakeタスクを定期実行したい。
あまりいい記事が見つからなかったのでまとめました。

## 前提
2022年10月現在
ruby 3.1.2
Rails 6.1.6
whenever
ec2
capistranoを使ってデプロイ

## 手順

1. Capistranoを適用する
2. schedule.rbを編集する
3. crontabをupdate
4. タイムゾーンを変更する
5. ec2上でエラーログを確認する方法

## 1, Capistranoに導入

capfileとdeploy.rbを編集する。
“`capfiel“`
“`ruby
require ‘whenever/capistrano’
“`
“`deploy.rb“`
“`ruby
set :whenever_roles, -> { :app }
“`

## 2, schedule.rbを編集する

確認すべきポイントはrakeタスクの環境がproductionになっているか。
そしてec2はbashなので、zshを

元記事を表示

dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)の対応方法について

## dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)について

dependent: :destroyオプションは、親モデルのデータが削除されるときにそれに関連していた子モデルのデータも削除することができるオプション。
このオプションを設定しないと、親モデルのテーブルのデータを削除するときにエラーになる。

![20221001_ownersテーブルとcatsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/85114159-d1f8-51bb-2c1d-ea53bba26c5f.png)

上記のようなテーブルがあり、ownersテーブルのid=3 高橋さんを削除すべく以下のコマンドを実行。

“`ruby:rails c コマンドの実行
irb(main):002:0> Owne

元記事を表示

Rails4.2でArelを用いてORクエリを作成

:::note warn
Rails4.2からActiveRecordがSQLのキャッシュのためにSQLのローカル変数 (`$1`など) を使うようになり、ActiveRecordで生成したActiveRecord::RelationをそのままORで繋げられなくなってしまった。
:::

解決時に勉強になったので備忘録として記載

## モデル

– aa_sample
– bb_sample
– cc_sample
– dd_sample

“`rb:関連付け
aa_samples has_many bb_samples
aa_samples has_many cc_samples
aa_samples has_many dd_samples
cc_samples has_many dd_samples
“`

“`rb:aa_sample.rb
# aa_sampleモデル内にscopeを定義
scope :for_test, -> { joins(:bb_sample).where(bb_samples: { test_code: ’01’ }) }
“`

#

元記事を表示

ReactからRails経由でS3へファイルをアップロードする方法

やっはろー、へっぽこだよ。
Reactでファイルのアップロードをする機能を作ったら案外手こずったから記事にしてみました。

バックエンドはRailsでS3にファイルを格納してます。

## ReactからファイルデータをRailsへ飛ばす

まずファイルを添付するボタンを作ります。
色々ありますが、今回は[Material-UI](https://mui.com)を採用しました。
おしゃれかつ痒い所まで手が届く機能を備えてます。

まずはMaterial-UIをインストールします。
“`
yarn add @mui/material @emotion/react @emotion/styled
“`

次に以下のコードをコピペしてください。
“`typescript:typescript
import React,{useMemo} from “react”;
import Input from “@mui/material/Input”;

export default function APP() {
const [file, setFile] = React.useS

元記事を表示

既存RailsアプリでNext.jsへの段階移行を始めた話

## 背景
### あるRailsアプリの新機能開発の様子

#### PM
「〜〜という新機能を追加します」

#### BE
「(routerに新しいリソース書いて)」
「(新しいモデルとDBマイグレーション書いて)」
「(コントローラとモデルにロジック書いて)」
「(viewテンプレートには仮でマークアップして)」

“`erb
<仮のdiv>
<% @items.each do |item| %>
<仮のdiv>
<%= item.name %>
<%= button_tag :item_button %>

<% end %>

“`

「マークアップお願いします」
「それとボタンクリックしたら〜〜するようにお願いします」
「>FE」

#### FE

「マークアップして」

“`erb
<適切なタグ class="適切なクラス">
<% @items.each do |item| %>
<適切なタ

元記事を表示

【Ruby on Rails】マイグレーション時に、任意のrakeタスクを実行する

今回は、マイグレーション時にrakeタスクを実行する実装をしたので、備忘録です。

# 実装
“`ruby
Rake::Task[‘db:migrate’].enhance do
Rake::Task[‘任意のタスク’].invoke
end
“`
やっていることとしては、enhanceでdb:migrateを事前タスクとして指定して、actionの中で任意のtaskをinvokeしているといった感じです。
独自のログを出力したり、最新のDBを自動でダンプしたりと使いどころは多いかと思います。

https://docs.ruby-lang.org/ja/latest/method/Rake=3a=3aTask/i/enhance.html

元記事を表示

【Ruby On Rails】 既存カラムにコメントを追加したい。

Railsで、既存のカラムにコメントをしたかった。
忘れそうなので、やり方をメモします。
まず、マイグレーションファイルを作成し、以下のように実装します

“` ruby
class AddColumnComments < ActiveRecord::Migration[6.0] def change change_column_comment(:table, :column, 'コメント') end ``` 基本的にはこれで大丈夫です! こんな感じで、カッコなしでも指定できます。 ``` ruby change_column_comment :table, :column, 'コメント' ``` ちなみに、上記の実装だと、マイグレーションをdownやロールバックした際こんなエラーが発生します。 ``` ActiveRecord::IrreversibleMigration: change_column_comment is only reversible if given a :from and :to option. ``` なので、こんな感じで `

元記事を表示

Remember_meのチェックをしたときにだけ、指定のURLに遷移しないようにする方法

Railsのログイン機能(Device)で、remember_meのチェックをしたときにだけログイン状態が継続するような仕組みを作るために苦戦したので備忘。

やりたいこと
 remember_meのチェックをしたとき、ログインのURLに遷移しないようにする。(ログインユーザの画面に遷移するようにする)
 チェックをしなければ、ログインのURLに遷移するようにする。

やったこと
 Userモデルにremember_meを有効にするコードを追加、更に、remember関数とそれに付随する関数を追加
“`/rails_projects/dev_obento_01/app/models/user.rb
class User < ActiveRecord::Base attr_accessor :remember_token # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable

元記事を表示

Railsで子レコードを複数同時保存する際のバリデーション

## やりたいこと
`gem ‘cocoon’`を使ったStationレコードのedit画面内の営業時間登録フォームで、曜日の重複をバリデーションメッセージ表示したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/59950242-373a-c253-0993-0b8dd13f137a.png)

ベストプラクティスを調べてみたが見つからなかったので、親モデルでのカスタムバリデーションで実装する

## モデル
“`ruby
### Stationモデル
class Station < ActiveRecord::Base has_many :business_hours, inverse_of: :station, dependent: :destroy validate :business_hours_day_of_week_is_uniq def business_hours_day_of_week_is_uniq day_of_week_a

元記事を表示

テストを自動化する

# 動機
テストのことを知らないため

# プログラマの三大美徳
怠惰、短気、傲慢がある。

### 怠惰
全体の労力を減らすために手間を惜しまない。

### 短気
コンピュータの動作が怠惰な時に怒りを感じる

### 傲慢
自分の書いたプログラムは誰に見せても恥ずかしくない胸を張って言える自尊心

## 気づき
三大美徳のためにテストを使うのか。

# Minitestの基本を選んだ理由
Railsのデフォルトのテすティングフレームワークなので、Railsを開発する時にも知識を活かしやすい。
※排発の現場ではMinitest以外のフレームワークが使われることもあるため

# テストコードの雛形
“`rb
require ‘minitest/autorun’

class SampleTest < Minitest::Test def test_sample assert_equal 'RUBY', 'ruby'.upcase end end ``` ### クラス名の注意点 Testで終わる、またはTestで始まる名前をつけることが多い。 ### テストのファイ

元記事を表示

Rails6系でtailwindcssを導入しようとして手こずった

Rails6系でポートフォリオを作成する中で、CSSフレームワークであるtailwindcssを導入しようとしたらかなり手こずったのでまとめます。
自分のためのまとめでもあるので、エラーも含め時系列順に書いています。
ご参考にされる際は最後までご覧ください。
記事初投稿&初学者のため、誤りなどありましたらお気軽にご指摘いただけると幸いです。

環境
ruby 3.1.2
rails 6.1.7

# tailwindcssをインストール
Gemfileに
“` ruby:Gemfile
gem ‘tailwindcss-rails’
“`
を追記して “bundle install“。

これでGemfile.lockに“tailwindcss-rails“が追加されるはずです。

次に
“` ruby:ターミナル
rails tailwindcss:install
“`

実行時のログは以下になります。(XXはユーザー名、XXXXXはディレクトリ名)
“`
Add Tailwindcss include tags and container element in

元記事を表示

flashに複数行を表示する方法について

## 環境
Rails5.2
Ubuntu20.4
Bootstrap5

## はじめに
flashに複数行を改行付でセットし、BootstrapのAlertに、箇条書きで表示する方法について書いてみました。

## 解説
flashに表示する複数のメッセージを、msg変数にセットします。
“`test_controller.rb
msg = []
msg << "メッセージ1" msg << "メッセージ2" msg << "メッセージ3" ``` msg配列から1要素づつ取得して、notice変数に文字列としてセットします。文字列の最後に、HTMLの改行**br**をセットします。brはmsg配列の最後の要素にはセットしません。 ```test_controller.rb msg.each_with_index do |val, idx| notice += "・ " + val notice += "
” unless (msg.length == idx + 1)
end
flash[:notice] = notice
redirect_to tes

元記事を表示

【Laravel / Rails】bulk insertについてまとめ

一度に複数のデータを1回のクエリでインサートしたいとき(bulk insert)、insert

## PHP/Laravel

クエリビルダの“`insert“`メソッド

“`php
DB::table(‘users’)->insert([
[‘email’ => ‘picard@example.com’, ‘votes’ => 0],
[‘email’ => ‘janeway@example.com’, ‘votes’ => 0],
]);
“`
https://readouble.com/laravel/9.x/ja/queries.html

先輩エンジニアに聞いたところ、「bulk insertは使うとしたら100万件くらいのデータ量の場合だが極力使わないほうがいい」とのこと。
今回のプロジェクトではデータ量がそこまで大量ではなかったため、bulk insertは結局使わないことにした。
下記記事も参考になった。

https://zenn.dev/naoki_oshiumi/articles/648a00bcd4d209

ただ、調べるとLar

元記事を表示

Docker環境でrails 6以降の構築しました。あ、macはM1チップです。

私はサラリーマンである。
ITエンジニアである。明日も7時前に起きて出社の準備をしないといけない。今深夜1時。

この記事を書き終わる頃には2時とかだろう、早く寝ろ俺。

しかし一個だけ言わせてほしい。

dockerお前の仕事は環境の差異をなくすことちゃうんか!?お前が一番差異に困惑しとるやないかぇぇぇぇぇぇウェえええええええ!!!

# 失礼しました

タイトルの通りrailsをDockerに走らせるだけの簡単なお仕事でミスりまくってものすごい時間を費やしたので書いてます。

# 試したこと

https://zenn.dev/tmasuyama1114/articles/rails-docker-5x-how-to

自分が作ったdeviceでログイン + 文章投稿する という簡単なアプリケーションを
上記リンクを参考にDockercomposeファイルを足してコンテナ化しようとしました。

# そもそも使てるアプリケーションがrails 6~

まず手始めにエラーが出たのは

“`ターミナル
bundler: command not found: rail……..
`

元記事を表示

OTHERカテゴリの最新記事