- 0.1. 2つの区間(Range)の重複を判定する方法
- 0.2. Webpackeコンパイルで詰んだこと
- 0.3. 【Ruby on Rails】Rails consoleで特定のレコードのカラムの情報を更新する方法
- 0.4. Aurora MySQLをサービス無停止でスケールアップ
- 0.5. リーダブルRSpec(カスタムマッチャー+RSpec::ContextHelper編)
- 0.6. Amazon Linux 2 の環境で rails c を立ち上げた際、日本語入力をすると Encoding::UndefinedConversionError が出ていたので修正
- 0.7. railsの基礎まとめ
- 0.8. Rails mapメソッドがふんわりしてたので調べてみた
- 0.9. 【rails入門】youtube埋め込み
- 0.10. Dockerで何もしていないのにRubyのバージョンが変わった時の対処法
- 0.11. 【RSpec】createアクションに関するテスト(リクエストスペックでUserモデルとリレーションのあるデータが追加されるかをテストする)
- 0.12. MySQLで「the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist」というエラーが出る
- 0.13. RailsのDateTime月の相対時間計算における、since関数と四則演算の結果の違いに注意
- 0.14. FactoryBotをSeedで使う
- 0.15. 【Rails】ランキング形式で投稿を表示する。(部分的にパーシャルの内容を変更)
- 0.16. 【Rails】本番環境(heroku)でうまく動作しない。(メールでの本人確認)【Action_mailer】
- 0.17. 文字を入力しているのにvalidationが反応してしまう時
- 0.18. sansanの1dayインターンに参加
- 0.19. Docker 開発・本番環境分け
- 1. はじめに
- 2. 環境
- 3. 原因
- 4. 解決
2つの区間(Range)の重複を判定する方法
どうも、「病院なび」の開発チームメンバー甘利です。
今日は区間(Rangeクラス)の重なりの判定について説明します。Rangeクラスを利用していると、それらが重なっているか?という判定をしたくなる時があります。
ActiveSupportを利用していれば .cover? メソッドを利用することができますが、
そうじゃない時はどうしたら良いでしょうか。ふたつの閉区間を表すRangeオブジェクトの r1 と r2 があり、
r1, r2 の端をそれぞれ r1_s, r1_e、r2_s r2_e と表すとします。
さて、このふたつのRangeが重なっていることを判別するにはどうしたら良いでしょうか。# 順当に考えてみる
ふたつのRangeの区間が重なっているとはどういうことかを書き出してみますと、
以下のいずれかが成り立つとき、とうことになります。
1. r1 の範囲に r2_s が含まれている
1. r1 の範囲に r2_e が含まれている
1. r2 の範囲に r1_s が含まれている
1. r2 の範囲に r1_e が含まれているこれをRubyのコードでそのまま書くと
Webpackeコンパイルで詰んだこと
#備考
技術関連の詳細記載はないので悪しからず。# なぜ起こったか
Herokuにデプロイしたのがきっかけです。
その際に依存関係解消のため、対象のバージョンを変更した。
デプロイに成功したが、ローカルでコンパイルできなくなった。
ローカルで関連するところ、モジュールなどインストールやアンインスール、アップデートした。# 結論
本来、エラーを解決していくのが筋かと思いますが、さまざま調べ試して詰んだので、
アプリ構築を初めからやり直しました。遠回りかもしれませんが、
これも一つの方法かと思います。幸い、体系的まとまった教材を参考にしていたので、
再構築もし易かったです。
なにより、作り直したことで問題となっていたコンパイルが解消したのが良かったと思います。
【Ruby on Rails】Rails consoleで特定のレコードのカラムの情報を更新する方法
## Rails console
“`
pry(main)> User.first.update_column(:name, “ごりら”)
“`
これは、Userテーブルの一番目のテーブルのnameカラムの内容を“ごりら“に変更したいとき## SQL文
“`
SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
UPDATE `users` SET `users`.`name` = ‘ごりら’ WHERE `users`.`id` = 1
“`こんな感じ。
Aurora MySQLをサービス無停止でスケールアップ
# はじめに
医療系クラウドサービスを提供している会社で働いている2kaiです。2022年7月に入ってから新型コロナウイルス感染爆発に伴い、患者及び医療スタッフの利用数が急増し、ピーク時間帯のデータベースCPU使用率がWriter、Reader共に監視の閾値を度々超えてくるという状態になりました。
と、思った次の日には100%に届くスパイクまで発生したために、急遽サービス無停止でスケールアップを実施しました。現時点での月間アクセス数は1億リクエストを超えるくらいです(正確には感染爆発の前月の集計値になります)。
作業時間帯(22時頃)のアクセス数は850/min。# システム概要
Ruby on Rails in awsで構成された、恐らく一般的なモノリスアプリケーションです。– アプリケーションはWeb、Worker、Batchから構成
– Ruby on Railsで実装し、WriterとReaderに負荷分散するようにコーディング
– 各アプリケーションはElastic Beanstalkで管理
– データベースはAurora MySQLで、WriterとRead
リーダブルRSpec(カスタムマッチャー+RSpec::ContextHelper編)
## 読みやすいRSpec書いていますか?
—
### 読みやすいRSpecって何?「簡潔でテストケースを見てテスト内容が理解しやすいもの」と考えています
ここでのテストケースとは、it/exampleブロックのことを指しています—
## 例題
例えば、Rails製REST APIのRequest Specを書くことを考えてみます
コードは正しいか確認していないので、多少間違っていてもお許しください?### 前提
* APIはたくさんある
* 良くないけど、クエリパラメータのチェックをcontrollerでしているため、テストはRequest Specで行う—
### APIの共通仕様
* Server Errorを除き、HTTPステータスコードは必ず200で返す
* HTTPレスポンスボディはJSON形式で返す
* 成功時のレスポンス
“`json
{ “status”: 200, “message”: “Succeed”, “data”: … }
“`
* 未認証時のレスポンス
“`json
{
Amazon Linux 2 の環境で rails c を立ち上げた際、日本語入力をすると Encoding::UndefinedConversionError が出ていたので修正
そもそもの文字の設定が問題でした。
`/etc/sysconfig/i18n` など共通で読み込まれるファイルに下記を追記したら入力できるようになりました。
“`
LANG=en_US.utf-8
LC_ALL=en_US.utf-8
“`
railsの基礎まとめ
# 前提
書籍アプリみたいなのを前提に書いています
### railsの更新系**createメソッド**
値の設定、DBへの保存までを一気に行うメソッド“`
irb(main):014:0> Book.create(
irb(main):015:1* name: “キングダム”,
irb(main):016:1* published_on: Time.parse(“20201024”).ago(2.months),
irb(main):017:1* price: 498,
irb(main):018:1* publisher: Publisher.find(1),
irb(main):019:1* )
“`上記を分解して記述する方法
**newメソッド**
モデルオブジェクトの作成
createメソッドとは違い、保存はされていない
saveメソッドを使い保存を行う“`
irb(main):001:0> book = Book.new
=> #
Rails mapメソッドがふんわりしてたので調べてみた
### はじめに
現場に入るとコードの至るところに扱い慣れていないメソッドが登場します。
これまでの記事でもpluckメソッドを紹介しました。
https://qiita.com/tatsu0209/items/61bdbe46216991aeb8d3
でも、現場でいちばん目にしたメソッドってなんだろうか・・・
そう、それはおそらくmapメソッドだ。
なんとなくわかったふりでふんわりと読んでいたので色々と調べてみました。
その結果を備忘録として残したいと思います。
もしもおかしな点やお気づきの点がありましたらご指摘いただけると大変ありがたいです。### 環境(自分のPC)
Ruby 2.7.1
Rails 6.0.5### mapメソッドとは
公式ドキュメントでは次のように説明されています。
>各要素に対してブロックを評価した結果を全て含む配列を返します。ブロックを省略した場合は Enumerator を返します。簡単に言うと、要素を順番に取ってきて、指定した処理をしてくれるメソッドです。
記述方法としては次のようになります。
~~~ ruby
配列.map { |変数|
【rails入門】youtube埋め込み
# やりたいこと
特定のyoutube動画をrailsアプリケーションで表示したい# まずは埋め込み方法
埋め込みたいyoutube動画を再生して右クリックで`埋め込みコードをコピー`をクリックします!
> [W/X/Y – Tani Yuuki (Official Lyric Video)](https://youtu.be/mp2-w15SXms)
![スクリーンショット 2022-05-16 14.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/29e242dc-63ca-3125-6dfb-e22bcd22ac44.png)そして`ctrl + v`でペーストすると↓のようになると思います。
(ペーストする場所は表示したい場所)
“`html:index.html
【RSpec】createアクションに関するテスト(リクエストスペックでUserモデルとリレーションのあるデータが追加されるかをテストする)
# 前提
表を作成するアプリをRailsを使って作成しています。
作成した表は、作成者のみが閲覧・編集・削除できるようにしたいと思っています。# やりたいこと
createアクションに関するリクエストスペックを書く。# 書いたコード
“`ruby:spec/requests/tables_controller_spec.rb
describe”#create”do
context “as an authorized user” do
before do
@user = FactoryBot.create(:user)
endit “adds a table” do
table_params = FactoryBot.attributes_for(:table)
sign_in @user
expect {
post tables_path, params: { table: table_params }
}.to change(@user.tables, :count)
MySQLで「the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist」というエラーが出る
## はじめに
開発環境にDockerを導入しようとして、なんやらかんやらいじっていたら、上記の症状が起きてしまいました。
具体的には、「rails serverを起動して、ローカルにアクセスする」、「MySQLを起動してshow databasesなどのクエリを実行する」などを行うとエラーになり、上記のエラーメッセージが表示されるようになりました。
~~~
mysql> show databases;
the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist
~~~
今回は、このエラーを解決するまでの手順と、その途中で出くわした問題などを、自分の備忘録として、かつ同じ問題に遭遇した方へ少しでも助けになれるようにと思い、書き残していきます。## 「mysql.infoschema’@’localhost」というユーザーを作成する
最初に、「the user specified as a definer (‘mysql.infoschema’@’localhost’) doe
RailsのDateTime月の相対時間計算における、since関数と四則演算の結果の違いに注意
# 2022/07/27追記
@koki_73 様からコメントをいただき、DateTimeクラスは非推奨になっているようです。
結論として、DateTimeは使わないようにするというのが正しい対処です。
@koki_73 様ありがとうございます!!# 結論
**DateTime**におけるsince関数は現在の日付に **30日加算しているだけ** です。例えば、1月31日の1か月後を求める場合以下のような違いがあります。
| 方法 | 結果 |
| —- | —- |
| .since(1.month) | **3月2日** |
| + 1.month | 2月28日 |
| next_month | 2月28日 |
| months_since | 2月28日 |# 注意
これはDateTimeの場合だけです。Dateはすべて2月28日になります。# プログラム例
“`ruby:irbの結果
# DateTimeクラスの場合はsince関数だけ結果が違います
a = DateTime.new(2022,1,31) # => Mon, 31 Jan 2022
FactoryBotをSeedで使う
# 結論
`require ‘factory_bot_rails’`をseedファイルの上部に記載することでFactoryBotが使えます。“`ruby:seedファイル
# rquireが重要!!!わすれないで!!
require ‘factory_bot_rails’# 例1:1個データを作る
FactoryBot.create(:parent, name: ‘親1’)
# 例2:いっぱいデータ作る
FactoryBot.create_list(:child, 5, name: ‘子’)
# 例3:戻り値を使って作ったデータを取得する & データをセットする
parent = FactoryBot.create(:parent, name: ‘親1’)
FactoryBot.create_list(:child, 5, name: ‘子’, parent: parent)
“`# 事前準備
## Gem
Gemの`factory_bot_rails`が必要です。Gemfileに追記しましょう。## Factory
上記例の場合、このような感じのFactoryが必
【Rails】ランキング形式で投稿を表示する。(部分的にパーシャルの内容を変更)
# はじめに
投稿をランキング形式で表示する際に、テンプレートは流用しつつ、第1位、第2位、、、のような数字部分を変えていく動作を加える。# 前提
下記は作成済み
ユーザーテーブル
マイクロポストテーブル
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |# 基本
ただ投稿内容を繰り返し表示していくには、下記のコードでOK。
“`言語名:app/views/microposts/index.html.erb
<%= render @microposts %>
# => <%= @microposts.each do |micropost|%>
# 第○位
# <%= render partial: 'microposts/micropost', locals:
【Rails】本番環境(heroku)でうまく動作しない。(メールでの本人確認)【Action_mailer】
# はじめに
開発環境である程度アプリケーションを作り、それをいざ本番環境で作るとなったとき、エラーになりうまく動かなかった。そこでherokuで正常に動作できるよう改善していく。# 前提
デプロイしたところから開始する。| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
| 4 | heroku | Heroku-20 |# heroku の状況確認
herokuコマンドで原因を探る。
“`言語名:ターミナル
$ heroku logs
“`
▼エラーに対して、下記の記事を参考に解決していく。https://qiita.com/kobayashimakoto/items/c7a96ea9f6cbc8d2da77
# 本番環境の設定
本番
文字を入力しているのにvalidationが反応してしまう時
# 概要
“`ruby:記事を書くきっかけ(model)
validates :content, presence: true, length: { in: 1..140 }
“`
というvalidationを書いた後、
なぜか文字を入力しているのにvalidationが反応したため
解決に至るまでの経緯を記そうと思います!# 経緯
プログラミングスクールのツイートアプリケーション作成課題に取り組んでいる際、
以下のバリテーションを実装しました。・投稿内容に対して1 ~ 140字以内の文字数であること
ところが、上記のバリテーションを実装し開発環境のViewで確認したところ
実装したvalidationを満たす内容でもvalidationが反応して
エラーメッセージが出てしまうという部分で詰まったため本記事を書くに至ります。# 原因
controllerのcreateアクションの記述が足りなかったことです。
※viewのformでsubmitしたパラメータをコントローラーで受け取っていなかった# 解決に至る経緯
上述したvalidationが反応してしまうケースは
sansanの1dayインターンに参加
## はじめに
sansanが開催する、Railsを使ったサーバーサイドのオフライン1dayインターンに参加しました。1dayとは思えないほど濃く充実したインターンでしたので、それを紹介していきます。
## タイムライン
10:30-10:45
参加学生、サポーターの方々の自己紹介11:45~11:30
会社紹介、本インターンで使う技術説明11:30~12:30
休憩12:30~17:00
ワーク17:00~19:00
振り返り、質問タイム19:00~19:30
オフィスツアー### 参加学生、サポーターの方々の自己紹介
普段オンラインのインターンで開発はしているものの、オフラインでのインターンは初めてですごく緊張していました(大阪在住なので東京に行く時点で気が張ってました、、)。ですが、みなさん優しくフレンドリーに接してくれてすぐに打ち解けることができました。
やはりほとんどの学生が関東在住でしたが、なんと同じ大学の人もいて親近感湧きました!
社員の方々はとても爽やかで、女性の方々は全員美人でした!
### 会社紹介、本インターンで使う技術説明
Docker 開発・本番環境分け
はじめに
RailsアプリをDockerで環境を分けてbuildしようとしたときに詰まったことがありました。同じように詰まっている人の一助になればと思っています。
環境
macOS Big Sur 11.6.6
rails 6.1.6
Docker 20.10.7
docker-compose 1.29.2原因
+ 開発・本番ともにDocker環境で構築
+ 開発・本番でシステム構成が異なるのでDockerfile、docker-composeの中身が違う
+ 開発から本番に移行する際に、Dockerfile、docker-composeの中身を本番に合うように変えた
+ 以降、開発環境でDockerが使えなくなった解決
+ 開発環境用のファイルと本番環境用のファイルをそれぞれ用意する(自分的に一番簡単な方法だった)
システム構成
開発環境(本番との違い: Nginxを使っていない、PostgreSQLのDockerイメ
default_scopeを使わずにorderメソッドでオブジェクトの並び順を変更する
# はじめに
default_scopeについて調べていると、「default_scopeは使うな」「default_scopeは非推奨」というワードが目に入りました。
今回はdefault_scopeを使わずに、orderメソッドでオブジェクトを新しいものから古い順に並び替えます。### default_scope
“`models/post.rb
class Post < ApplicationRecord belongs_to :user default_scope -> { order(created_at: :desc) }
validates :user_id, presence: true
end
“`“`posts_controller.rb
def index
@posts = Post.all
end
“`“`posts/index.html.haml
%ul
– @posts.each do |post|
%li
= post.title
= post.created_at
“`
新しい