- 1. railsでdistinctとin_batchesを同時に利用するのはアンチパターン
- 2. クラスにモジュールを取り込むinclude、prepend、extendの違いと比較
- 3. Rubyのクラスメソッドとインスタンスメソッドの概念
- 4. Javascriptを使用してフォームを何個も追加
- 5. Action View Bug Report with View Paths
- 6. 【Rails】手動テストでカバレッジを計測する
- 7. DM(チャット)機能 非同期化
- 8. DM(チャット)機能非同期化の失敗
- 9. Rails でカラムを追加する際、既存レコードに影響を与えずにデフォルト値を設定したい
- 10. rails永続的なセッション
- 11. [Rails7]submitにつけるdisable_withオプションについて
- 12. ActiveHash
- 13. 最終課題を終えて
- 14. [Rails入門] 初めてのRails(GitHub)
- 15. flatpickrを使ってみる
- 16. Rails ポートフォリオにGoogleMap APIを導入 複数の住所を表示
- 17. 【個人開発】手紙でリレー小説できるアプリ「言の葉つづり」を作りました【Next.js×Rails】
- 18. 多対多のマイグレーションファイルの用意
- 19. 実務未経験の初心者がRailsを学習してみた
- 20. Ruby エイリアスメソッド
railsでdistinctとin_batchesを同時に利用するのはアンチパターン
# 背景
railsでdistinctとin_batchesを同時に利用すると、正しい値が取得できなかったので解説する# 内容
`User.select(:user_id).distinct.in_batches(of: 2) { p _1.pluck(:id)}` の挙動についてusersテーブルに1~5のidを持つレコードが格納されているとした時、
“`
[1,2]
[3,4]
[5]
“`と出力されると期待していたが
“`
[1,3]
[1,2]
[5]
“`のように値が重複して出力されてしまった
`User.select(:user_id).distinct.in_batches(of: 2) { p _1.pluck(:id)}` の挙動について
ChatGPTに確認したところ、
> ActiveRecordでdistinctを使用して一意なレコードを取得した後にin_batchesを使用すると、クエリの処理方法によっては重複した値が含まれる場合があります。これは、in_batchesがページング処理を行う際にdistinctが適用される前の段
クラスにモジュールを取り込むinclude、prepend、extendの違いと比較
モジュールをクラスに組み込むには3つの方法があります。それは `include`、`prepend`、そして `extend` です。この記事では、これら3つの方法の違いと共通点を詳しく解説し、比較します。
## Rubyのinclude
`include` は、他のモジュールからコードをクラスにインポートする最も一般的な方法です。`include` はモジュールのメソッドをクラスのインスタンスメソッドとして追加します。つまり、そのクラスのオブジェクトでこれらのメソッドを呼び出すことができます。
### includeの例
“`ruby
module Greetings
def greet
puts “Hello world!”
end
endclass Person
include Greetings
endperson = Person.new
person.greet # 出力: “Hello world!”
“`### モジュールをクラスにincludeしたときのancestors chain
モジュールをクラスに `include
Rubyのクラスメソッドとインスタンスメソッドの概念
**クラスメソッド**と**インスタンスメソッド**はオブジェクト指向プログラミングにおいて重要な概念です。この記事では、Rubyプログラミング言語におけるクラスメソッドとインスタンスメソッドについて説明します。
## クラスメソッドとは?
クラスメソッドはクラス上に定義され、クラスのインスタンスではなく、クラス自体に対して直接呼び出すことができるメソッドです。これらはクラス全体に関連する操作に使用されることが多いです。
#### クラスメソッドの定義方法
Rubyではクラスメソッドの定義方法は非常に柔軟です。以下にクラスメソッドを定義するための3つの一般的な方法を示します。
“`ruby
# 方法1
class Car
def self.total
10
end
endputs Car.total # => 10
# 方法2
class Car
class << self def total 10 end end end puts Car.total # => 10# 方法3
class Car; end
Javascriptを使用してフォームを何個も追加
# はじめに!
ポートフォリオ制作中です!
書こう書こうとずっと思ってはいたのですが、なかなか手がつけられず…
忘れないうちに書き始めようと決心しました…!今回はJavascriptでフォームを何個でも追加できるような実装をアウトプットします✍️
`accepts_nested_attributes_for`を使用して子要素を親要素で保存や変更できるようにしています!
(後々調べると、`accepts_nested_attributes_for`は使用しない方がいいかもという記事をちらほら見かけますが、ポートフォリオも終盤で今更変えられないのでこのままでいきます!)https://zenn.dev/murakamiiii/articles/5ecefb7a58d1ef
https://zenn.dev/ysi831/articles/0faa4c301e7d9f
# 完成図
旅行やデートのプランを共有するSNSサイト「Go out Planning」を絶賛作成中です
プラン概要の中に何個でもスケジュールフォームを追加できるようにするため、
今回は動的フォーム追加を実装しま
Action View Bug Report with View Paths
Recently there was a [bug](https://github.com/rails/rails/issues/52142) reported to rails which results in an infinite loop when passing a form builder object into a partial.
“`ruby
<%= form_for [:admin, @author], html: { class: 'form form-horizontal', multipart: true, style: 'margin-bottom: 0' } do |f| %>
<%= render partial: 'my_partial', locals: { f: f } %>
<% end %>
“`This would result in:
“`ruby
Completed 500 in 1701ms (ActiveRecord: 1314.9ms | Allocations: 163362)SystemStackErro
【Rails】手動テストでカバレッジを計測する
# はじめに
Ruby on Railsプロジェクトの手動テストでもコードカバレッジできたので、その方法をメモしておきます。
通常、カバレッジは自動テストコードの実行とともに計測するものですが、何らかの事情で自動テストコードが不足していてカバレッジが計測できない、あるいはカバレッジがとても低いといったことがあるかと思います。
本来、自動テストコードを書き足してカバレッジを上げるべきなのですが、それができない場合、せめて手動テストのカバレッジを計測できれば、手動テストの有効性が可視化できるのではないかと考えました。
# 前提
カバレッジ計測用のgemとしてSimpleCovが導入されている前提です。
このgemを普通に使うための導入や設定方法は他の記事を参考にしてください。この記事では手動テストでカバレッジする方法にフォーカスしてお伝えします。
# 計測の流れ
– 手動カバレッジの設定を行う(下記参照)
– Rails起動時にカバレッジの計測を開始する
– 各種手動テストを行う
– 手動テストが終わったらカバレッジの計測を止めてレポートを出力する
– レポートを見る#
DM(チャット)機能 非同期化
# はじめに
非同期化の失敗を先ほどアウトプットしていましたが、
DM機能の非同期化もまとめておきたいと思います!# 完成物
コメントは吹き出しをつけて、送信フォームは下に固定しています!# ER図
今回は非同期化のまとめなので実装方法は割愛しますが、
こちらのER図にて実装しています![スクリーンショット 2024-06-19 21.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/042bc327-f2fe-fa71-6e98-9e0c60504436.png)
実装方法はこちらの記事が大変わかりやすかったです
⚠️全く同じというわけではないと思います!https://qiita.com/mi-
DM(チャット)機能非同期化の失敗
# はじめに
ポートフォリオ制作中です
今まで、いいねやコメント、フォローと非同期化してきましたが、
今回は大きく躓いてしまったのでアウトプットします⚠️こちらは失敗のアウトプットです
非同期化の全体の流れは以下の記事にまとめてます🌱https://qiita.com/3rarara/items/b434d7331f88c5ee5a49
# 一つ目のエラー
“`
ActionController::UnknownFormat in Public::ChatsController#create
Public::ChatsController#create is missing a template for this request format and variant.
request.formats: [“text/html”]
request.variant: []
raise ActionController::UnknownFormat, message
“`テンプレートフォーマットがないよと言われています
これはシンプルに`local: true`を`lo
Rails でカラムを追加する際、既存レコードに影響を与えずにデフォルト値を設定したい
株式会社iCAREの[西口](https://twitter.com/NishiguchiNaoya)です。
今回は、デフォルト値付きでカラムを追加する要件のレアケースに遭遇したので記事に残します。## 実現したかったこと
デフォルト値を指定してカラムを追加する、という実装はよくあると思いますが、今回は下記要件を満たす必要がありました。:::note info
– 既に存在するレコードにはデフォルト値を適用せず、 `nil` を割り当てたい
– 今後作成するレコードにはデフォルト値が入るようにしたい
:::## 結論から 💁♂️
### うまくいったコード
“`ruby
class AddColumnToHogeTables < ActiveRecord::Migration[5.0] def change # デフォルト値を nil でカラムを追加した後、 100.0 に設定する add_column :hoge_tables, :some_item, :float, default: nil change_column_default :
rails永続的なセッション
# 概要
railsを勉強している時に永続的なセッションを作成するのに
便利なメソッドがあったので記録として残します。# 実際のコード
“`.rb
cookies[:remember_token] = { value: remember_token,
expires: 20.years.from_now.utc }
“`
上記は20年後期限切れになる記憶トークンです。
これをメゾットを使うことで
“`.rb
cookies.permanent[:remember_token] = remember_token
“`
のように書くことができます。
[Rails7]submitにつけるdisable_withオプションについて
## はじめに
Rails7以前までは[[Rails]submitタグにつけておきたいdisable_withオプション](https://qiita.com/sue738/items/09f569bdc3a73d26df88)の記事にあるように、data属性に`disable_with`を付与すれば、二重送信が防止できておりました。
“`slim
= form_with(model: model) do |form|
= form.submit ‘登録’, { data: { disable_with: ‘登録中・・・’ }
“`ですが、Rails7移行では、`disable_with`オプションが機能しなくなっているので、どのように実現したかを残しておきます。
## どう変わったのか
[Rails 7.0 + Ruby 3.1でゼロからアプリを作ってみたときにハマったところあれこれ
](https://qiita.com/jnchito/items/5c41a7031404c313da1f#disable_with%E3%81%AE%E6%8C%87%E5%AE
ActiveHash
# ActiveHashとは
カテゴリー名などの、変更される予定の無いデータをモデルファイルに記入することで、データベースに保存することなくActiveRecordのようなメソッドを使用することができるようにするGemのことです。# なぜActiveHashを使用するのか
ActiveHashを使用する理由は、データベースへのクエリと比較すると負荷が小さく、アプリケーションのパフォーマンスへの影響が少ないと考えられるからです。ActiveHashを使用した場合データはメモリ上に保存され、データベースに保存するよりも、高速でデータの取得を行うことができます。
# インストール方法
Gemfileの最下部に以下の内容を追加します。
“` :Gemfile
gem ‘active_hash’
“`
ターミナルで実行します。
“`
bundle install
“`# 使用方法
ActiveHashを使用するために、まずはモデルを作成します。(今回はCategoryモデル)
“`
rails g model category
“`
ActiveHash::Base
最終課題を終えて
2024年2月からプログラミングオンラインスクールに入学し早4ヵ月。
PCを購入するところから:sweat_smile:始まり、ようやく最終課題のフリマアプリを完成できたので全体を通して振り返りや今後についてまとめたいと思います。#### きっかけ
プログラミングを習おうと思ったきっかけは現職(美容師)であと何年働けばいいんだろう・・・?という不安からでした。
一人息子を一人で育てる親として、現職では収入も時間も満足に確保できないと考えていました。#### なぜプログラミング?
これは単純に憧れです:flushed:
現場で立ち仕事、カラー材でシャツは汚れ、手は荒れ、長時間労働している美容師からすると(スマートに仕事をこなす美容師さんもいます!あくまで私の現状です:pray_tone1:)、
PCカタカタ(カッコいい!)、リモートワークで家事育児仕事をこなせる仕事って魅力的過ぎました!
また、淡々と同じスタイルを100回切ってようやく1スタイル身につけたり、毎日何十人・月何百人の初めましてのお客様と約2時間マンツーマン対応する臨機応変能力は、プログラミング初心者に必要な探求心・
[Rails入門] 初めてのRails(GitHub)
最近Ruby on RAilsのチュートリアルに挑戦している初心者の自分が、初心者に向けての記事です。
今回はGitHubにプッシュするまでの流れを解説します。初めてGitHubを使う方向けに、Gitの基本的な操作も含めて説明します。# gitの初期設定
まずはユーザー設定。これは1度しちゃえばOK‼️
“`
$ git config –global user.name <自分の姓名(ローマ字)>
$ git config –global user.email <自分のメールアドレス(your.email@example.comなど)>
“`
今後自分が行うプロジェクトの変更を、自分の「名前」や「メールアドレス」で調べられるようになります。この設定は、Gitで共同作業を行う場合に特に役立ちます。# GitHubアカウントの作成
[GitHub公式サイト](GitHubアカウントに登録(サインアップ))でGitHubアカウントに登録(サインアップ)しましょう。# Gitリポジトリの初期化
作成したRailsアプリケーションをGitで管理するために、リポジトリを初期化し
flatpickrを使ってみる
# はじめに
これは、案件でrailsデフォルトのdatetime_fieldが利用されていたが、使いづらかったのでそれを作り替えた作業禄です。# 改修前
“`haml
公開開始日時
= f.datetime_field :open_at, class: ‘input input-bordered rounded-lg’
“`![l_6814799_122_2be594269a33f1091cc5306cc6458569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/98128b2d-23e0-a8d7-1e3c-f4ac54483fde.png)
日付はカレンダーで設定が可能なのに、時間はマウスオーバーして時間を設定しなおさなければいけないのが使いづらかったのです。
# 実装
“`bash
yarn add flatpickr
“`“`js:app/javascript/controllers/flatpickr_controller.js
i
Rails ポートフォリオにGoogleMap APIを導入 複数の住所を表示
# はじめに
ポートフォリオにGoogleMap APIを導入しました
一つの投稿に複数の住所が登録されている可能性があるため
複数の住所が表示できるように実装しました!
アウトプットします✍️※旅行やデートのプランを共有するアプリなので、投稿機能はPostではなくPlanを使用しています!
また、Plansの子要素としてPlanDetailsモデルがあり、そこにaddressカラムがあります!# GoogleMap APIキーとGeocodingAPIを取得
導入手順は割愛させていただきます!
こちらの記事に詳しく手順が紹介されていましたので、
ご確認ください!https://qiita.com/nagase_toya/items/e49977efb686ed05eadb
https://qiita.com/mattan5271/items/1b784dbbe5f1c336ac70
# ER図
![スクリーンショット 2024-06-17 21.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazon
【個人開発】手紙でリレー小説できるアプリ「言の葉つづり」を作りました【Next.js×Rails】
# はじめに
はじめましてこんにちは、とぴ([@topi](https://x.com/topi_log))と申します。
オンラインプログラミングスクールにてRuby on Railsをメインに学習しつつ、自主学習としてフロントエンドも勉強しています。
(という序文を見るのが2回目以上の人はありがとうございます。)
3/30に公開したリレー小説アプリ「言の葉つむぎ」の第2弾として6/15に「言の葉つづり」を公開しました。
「言の葉つむぎ」については下記記事にありますのでよろしければご覧くださいませ。https://qiita.com/topi_log/items/3ef541d490ee4c332752
今回作成したアプリの紹介、技術、感想をまとめさせていただきます。
どうぞよろしくお願いいたします。# 目次
1.作成経緯
2.Webアプリの紹介
3.技術スタック
4.「言の葉つむぎ」からの変更点
5.こだわったところ
6.反省点
7.感想# 1.作成経緯
「言の葉つむぎ」でいただいたフィードバックを元に、改めてアプリを作りたいと考えていました。
しばらくスクールの卒業制
多対多のマイグレーションファイルの用意
# 概要
– ちょっとハマった# 内容
こんな感じの要件を満たすためにマイグレーションファイルを用意した
– 既存モデルA
– 追加モデルB
– AとBの中間テーブル“`ruby
class CreateModelB < ActiveRecord::Migration[6.0] def change create_table :model_b, id: :bigint, unsigned: true do |t| t.integer :xxx, null: false, default: 0 t.integer :yyy, null: false, default: 0 t.timestamps end end end ``` ```ruby class CreateModelAModelB < ActiveRecord::Migration[6.0] def change create_table :model_a_model_b, id: :bigint, unsigned: true
実務未経験の初心者がRailsを学習してみた
# ① はじめに
初投稿になります🌷
IT業界に未経験で転職して約1週間が経過し、
元々HTML/CSSの知識がごく僅かしかない私が、Ruby on Railsを学習してみました。
特に重要だなと思ったところや、自分の中で引っかかったところを中心にアウトプットしていきます!# ② 使用した教材
今回はudemyの、
[はじめてのRuby on Rails入門-RubyとRailsを基礎から学びウェブアプリケーションをネットに公開しよう](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/?couponCode=KEEPLEARNING) を使って勉強しました。![スクリーンショット 2024-06-10 13.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/7b404efc-7a79-8e27-f512-3662d2b67786.png)
Ruby エイリアスメソッド
# エイリアスメソッドについて
Rubyには全く同じ機能でありながら異なる名前のメソッドが複数存在します。これらのメソッドのことをエイリアスメソッドと呼びます。
可読性向上やプログラマーの好みによって使い分けられています。(メソッドによっては派閥がわかれているとか…)以下にエイリアスメソッドの一例を記載します。
# エイリアスメソッド一覧
## Array クラス
– `map` と `collect`
– `size` と `length`
– `slice` と `[]`
– `append` と `push`
– `prepend` と `unshift`## Hash クラス
– `store` と `[]=`
– `size` と `length`
– `key` と `index`
– `to_s` と `inspect`## String クラス
– `size` と `length`
– `slice` と `[]`
– `to_s` と `to_str`## Enumerable モジュール
– `collect` と `map`
– `f