- 1. 【初心者向け🔰】CodeWars【学習サイト】
- 2. 【Ruby】最近発見した便利な記述方法メモ
- 3. [Rails]あ…ありのまま、今起こった事を話すぜ!「おれはorder(created_at: :asc)と実装したと思ったら、created_at descのSQLが実行されていた」
- 4. Rubyで連分数展開のプログラムを書いてみた
- 5. マイグレーションファイルの修正、削除について
- 6. 条件をクラス化してコードの拡張性と可読性を向上する
- 7. ネストしたルーティングの_pathヘルパーについて
- 8. 【Rails】saveメソッドとcreateメソッドの使い分け
- 9. あるある、空白のエラー?!
- 10. 簡単に rails API を実装してみた
- 11. 論理否定の`!`と`nil?`メソッドを組み合わして使った際のメモ
- 12. 【Ruby】ifとunless
- 13. 【Ruby】演算子達の備忘録
- 14. ローカルでRailsを環境構築
- 15. gem Faradayを使ったWordPress記事の取得方法について
- 16. [Rails] モデルの関連付け纏め(アソシエーション)
- 17. 【Ruby on Rails】学習メモ:配列のエラーにはまった話
- 18. gem が build できなかった (MAKEDIRS)
- 19. 配列の要素を削除する方法
- 20. 【Docker Storage】バインドマウントでホストマシンのファイルを Ruby コンテナで実行する
【初心者向け🔰】CodeWars【学習サイト】
# はじめに
https://www.codewars.com/dashboard
Codewars というサイトをご存知でしょうか
いろんな言語のアルゴリズム問題を解くことができるサイトです。類似するサイトで有名なものだと「AtCoder」や「Paizaラーニング」があります。
# Codewarsのオススメな点
個人的には、アルゴリズム問題サイトで一番オススメです。## 時間制限がないから、学習に集中できる
:::note alert
PaizaラーニングやAtCoderは**時間が計測されます**。
また、Paizaラーニングでは**時間制限があります**。
:::私的な話になりますが、時間が計測されていると集中ができません。
また、
– 「雑に書いても早くしたい」
– 「ミスの可能性とトレードオフに、スピードを求める」ということが起こります。
これは学習とは真逆です。
また、実際の開発においても不要な考えだと思います。
この点、CodeWarsには**時間制限がない**ため、のびのびと学ぶことができます。
## トライ&エラーできて、学びの効率
【Ruby】最近発見した便利な記述方法メモ
ここ数日qiitaを巡回していて見つけたRubyで完結に書ける実装方法メモ。
### |
“`ruby
array1 = [“a”, “b”]
array2 = [“b”, “c”, “d”]array1 | array2
# => [“a”, “b”, “c”, “d”]
“`
配列と配列を結合して1つの配列を返す。
重複する要素は1つにまとめられる。
### &
“`ruby
array1 = [“a”, “b”]
array2 = [“b”, “c”, “d”]array1 & array2
# => [“b”]
“`
共通する要素のみを取り出して配列として返す。
### array.map(&:method)
“`ruby
array = [“a”,”b”, “c”]
array.map(&:upcase)
# => [“A”, “B”, “C”]array.map(&: * 2)
# => error
# mrthodじゃないから処理できない
“`
`array.map{|item| item.method}`を簡潔に書くことができる。
[Rails]あ…ありのまま、今起こった事を話すぜ!「おれはorder(created_at: :asc)と実装したと思ったら、created_at descのSQLが実行されていた」
な… 何を言っているのかわからねーと思うが
おれも 何をされたのか わからなかった…頭がどうにかなりそうだった…
[reverse_order](https://railsdoc.com/page/model_reverse_order)をチェーンしていただとか超スピードだとか
そんなチャチなもんじゃあ断じてねえもっと恐ろしいものの片鱗を味わったぜ…
—
ということで、前置きはここまでにして実際に私が体験した話です。
タイトルの通り`order(created_at: :asc)`と実装したのに、SQLは`created_at desc`と実行される実装について説明します。
ここまでの話だけで、パッと実装が思い浮かぶ方はActiveRecordマスターだと思います…!
私は10年弱Rails触っていますが、初めて気づきましたw## 実装
わかってしまえば、やり方は簡単です。
Userというモデルがある場合、下記実装では発行されるSQLのorderは逆になります。“`ruby
User.order(created_at: :asc).last
“``
Rubyで連分数展開のプログラムを書いてみた
# 連分数とは
**連分数**とは、以下のように分母に分数が含まれているような分数です。ただし、 $a_n$ と $b_n$ は整数です。また、 $b_n$ がすべて $1$ の場合、**正則連分数**と呼ばれます。(この記事では正則連分数のみを対象とするので、以降 「連分数」 と表記したものは正則連分数を指します。)
“`math
x = a_0 + \frac{b_1}{a_1 + \frac{b_2}{a_2 + \frac{b_3}{a_3 + …}}}
“`上記の $x$ が有理数の場合 $a_n$ は有限ですが、無理数の場合は無限に続きます。例として、黄金数 $\varphi = \frac{1 + \sqrt{5}}{2}$ は以下のように $a_n$ がすべて $1$ で、それが無限に続きます。
“`math
x = 1 + \frac{1}{1 + \frac{1}{1 + \frac{1}{1 + …}}}
“`# 連分数展開とは
ある数を連分数に変形することを、**連分数展開** と呼びます。小数は以下の手順で連分数展開できます。
マイグレーションファイルの修正、削除について
## 概要
・マイグレーションの扱いについて
・修正、削除する方法は2つある
・rails db:rollbackで修正、削除する方法
・コマンドラインを使用しての修正、## マイグレーションの扱い
・テーブルの設計図や仕様のこと
・データーベースにテーブルを作成するために必要なファイル
・カラム名に対して、カラムの型を指定する
integer型(数値)、string型(短文の文字)、text型(長文の文字)などがあるモデルを作成
“`
rails g model テーブル名(複数形)
“`
↓
モデル作成時に生成されるマイグレーションファイルに必要な情報を記述する“`
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| # t.カラムの型 :カラム名, オプション t.string :postal_code, null: false t.string :cit
条件をクラス化してコードの拡張性と可読性を向上する
ある処理の実行条件がコンテキスト毎に異なる場合のリファクタリング作業で、
ポリシーパターンの「条件をクラス化する」という考え方がとても役立ちました。実際のリファクタリングを通じて、「拡張性に優れる」「コードが読みやすくなる」といったメリットを感じています。
この記事では、「条件をクラス化」することでこれらのメリットがどのように実現されるのか、コード例を示しながら解説します。
:::note warn
1. コード例はポリシーパターンの一部を採用したもので、厳密にはポリシーパターンではありません
2. 記事の内容は「リファクタリングを通じて私が実感したメリット」に関する解説が中心です。参考書籍には書かれていない内容が多く含まれています。内容に誤りがある可能性にご注意ください
3. コード例は ruby で書かれています
:::参考書籍↓
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
6.3.1 ポリシーパターンで条件を集約
https://amzn.asia/d/065vcay7## 例)キャンペーン機能
「条件をクラス化する」題材と
ネストしたルーティングの_pathヘルパーについて
## 読んで欲しい人
– `link_to post_edit_path(@post, @hoge)`でなんで2つ引数を入れているかわからん人へ
– 過去の自分## 動作環境
– ruby 3.3.0
– Rails 7.1.3.3## pathヘルパーとは
– URLを生成するための便利なヘルパーこんなルーティングがあったら
“`ruby:routes.rb
resources :posts
“`下記のようにURLを生成してくれる
– `posts_path`→/posts
– `new_post_path`→/posts/new
– `edit_post_path(:id)`→/posts/:id/edit
– `post_path(:id)`→/posts/:id今回メインに扱うのは下記
– `edit_post_path(:id)`→/posts/:id/edit
– `post_path(:id)`→/posts/:id基本的に、ビューやコントローラに`edit_post_path(@posts)`という使い方をする。
引数を指定して、リンク
【Rails】saveメソッドとcreateメソッドの使い分け
## はじめに
データ保存などで使用する`save`メソッド・`create`メソッドをどういう使い分けをしたら良いかに悩んだので、
勉強がてら使い分けについてまとめました。## saveメソッドの使用場面
`save`メソッドは以下のように使用します。
“`ruby:
user = User.new(name: ‘taro’, age: 18) #インスタンス生成
user.save #生成したインスタンスの保存
“`
`save`メソッドの戻り値は`true`か`false`です。
実行結果によって分岐をさせたい場合などは、`save`メソッドが使用できます。## createメソッドの使用場面
`create`メソッドは以下のように使用します。
“`ruby:
user.create(name: ‘taro’, age: 18) #インスタンス生成+保存
“``create`メソッドは`new`と`save`を一度に実行してくれます。
しかし、createはインスタンスを戻り値として返すため、登録に成功したかどうかの判定には使用できません。## まとめ
下
あるある、空白のエラー?!
## ★はじめに★
GitHubでプルリクエストのコードレビューをしたとき、初めての頃は高頻度で出ていたエラーがあります。
それは**コードの末尾に改行をいれて**というエラー:scream:初期のころは何度もこのエラーに遭遇しました😢
その度、該当ファイルのコードの末尾にひたすら`Enter`
疲れますね– [ ] なぜ末尾に改行を入れるのか
– [ ] 何かいい方法はないのかこれら情報をアウトプットしようと思います。
## ★なぜ末尾に改行を入れるのか★
前提として、多くのプログラミング言語やツールは、ファイルの終わりに改行がないとエラーや警告を出すことがあるそうです。
歴史的にテキストファイルが行単位で処理されることが多く、行の終わりを改行で示すことが一般的だったから。
具体的には、以下のような理由があります**1:互換性**
多くのツールやエディタがファイルの終わりに改行があることを前提に作られているため、改行がないと正しく動作しないことがある。**2:バージョン管理システム**
Gitなどのバージョン管理システムも、ファイル末尾に改行がないと変更として認
簡単に rails API を実装してみた
# Docker
参考
https://zenn.dev/trysmr/articles/b9c99302ebc205
本記事では、web コンテナのポートを 80:3000 で実装している
# rails API 実装
## cors 設定
`Gemfile`
“`ruby_diff
+ gem ‘rack-cors’
“``config/initializers/cors.rb`
“`ruby
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ‘http://localhost:3000’resource ‘*’,
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
“`## ログイン機能実装
devise を使用する
### ライブラリインストール
`Gem
論理否定の`!`と`nil?`メソッドを組み合わして使った際のメモ
# やろうとしたこと
– 条件分岐をさせるにあたって boolean で結果を取得したかった
– 「オブジェクトが nil なら false を返してほしい」という目的
– `nil?`は「nil なら true を返す」ので論理否定と組み合わせた▲しかし、論理否定`!`をと`nil?`を組み合わせて使うと自分が想定している結果が返ってこない
以下にサンプルを示す
“`:ソースコード
p (“aaa”)
p !(“aaa”)
p (nil)
p !(nil)
p (“———-“)
p (“aaa”).nil? #【1】
p !(“aaa”).nil? #【2】
p !((“aaa”).nil?) #【3】
p (“##########”)
p (nil).nil? #【4】
p !(nil).nil? #【5】
p !((nil).nil?) #【6】
“`“`:実行結果
“aaa”
false
“———-”
false #【1】
true #【2】
true #【3】
“###
【Ruby】ifとunless
# if文
“`ruby:qiita.rb
a = 100
if a == 100 #条件
puts “aは100です” #条件を満たした時の処理
end
“`
if文は、条件を満たした時に処理を実行。
条件を満たす時とは、条件がtrueの時。
# unless文
“`ruby:qiita.rb
a = 200
unless a == 100 #条件
puts “aは100ではありません” #条件を満たした時の処理
end
“`
unless文は、条件を満たさない時に処理を実行。
条件を満たさない時とは、条件がfalse若しくはnilの時。
unless == if notのイメージ。なお、下記のようにif文を用いて書き換えも可能。
“`ruby:qiita.rb
a = 200
if a != 100 #条件
puts “aは100ではありません” #条件を満たした時の処理
end
“`
この場合は、条件(a != 100)がtrueなので、条件を満たした時の処理が実行される。
【Ruby】演算子達の備忘録
# 比較演算子
“`ruby:qiita.rb
a == b # a と b が等しい
a != b # a と b が等しくない
a < b # a が b よりも小さい a > b # a が b よりも大きい
a <= b # a が b 以下である a >= b # a が b 以上である
“`
等しいかどうかの判断は`==`、変数への代入は`=`となるので注意。
条件を満たせばtrue、満たさなければfalseを返す。# 論理演算子
“`ruby:qiita.rb
!a # a が false であれば
a && b # a かつ b が true であれば
a || b # a または b が true であれば
not a # a が false であれば
a and b # a かつ b が true であれば
a or b
ローカルでRailsを環境構築
### はじめに
今回はローカル環境で1からRailsを立ち上げるところまで解説したいと思います。ProgateやRailsチュートリアルなどは専用のエディタとクラウドIDEなどでRubyonRailsを学習することが可能ですが、より難易度を上げ挑戦したいのであれば、自分のパソコンに1から環境構築してみると良いと思います。今回はそんな環境構築を1から解説してみたいと思います:::note warn
今回はWindowでのインストール方法で解説します
Macでは少々手順が違いますのでご注意ください
:::## 環境構築の手順
インストールするもの
* Ruby
* データベース(今回はSQLite)
* Bundler
* Railsこの4つのインストールです
早速やっていきましょう## Rubyのインストール
まずはRubyがインストールされているかを確認しましょう。ターミナル画面で以下のコマンドを打ってみましょう
“`
ruby -v
“`こちらで以下のような表記が出れば既にインストールされているのでこちらはパスして構いません。
“`
ruby
gem Faradayを使ったWordPress記事の取得方法について
## はじめに
アプリ制作の過程で、APIを利用してWordPressの記事を取得し、RailsのDBに保存をする実装を行いました。
その際に`gem Faraday`を使用したため、ここではその実装過程で得られた気づきをまとめます。
## 本記事の内容
`gem Faraday`を使いWordPress記事を取得する方法について## 対象者
`gem Faraday`を使ってWordPress記事を取得する方法を知りたい方
## REST APIを使った記事取得方法
WordPress REST APIを使用することで、簡単に記事一覧を取得できます。例えば、今回取得したいWordPressのURLの後ろに `/wp-json/wp/v2/posts` をつけてアクセスするだけで、JSON形式で記事一覧が取得可能です。これを利用して、Rails側から記事一覧を取得する手順を説明します。## Faradayのセットアップ
まず、Gemfileに gem ‘faraday’ を追加し、bundle install します。次に、Faradayの接続設定を行います。
“`ru
[Rails] モデルの関連付け纏め(アソシエーション)
## はじめに
[HappinessChain](https://happiness-chain.com/)で学習しているAisakaです。
苦手なアソシエーションの理解を深めるため、それぞれの使い方を纏めてみました。## 注意点
この記事では以下の内容については解説していません。
– N+1問題
– アソシエーションのオプション(`dependent`等)N+1問題ってなに?って方には次の記事が参考になるかと思います。
https://qiita.com/massaaaaan/items/4eb770f20e636f7a1361
## アソシエーションとはなにか?
アソシエーションとは、Railsにおいてモデル(データベースのテーブル)間の関連付けを定義する機能です。これにより、関連するデータを簡単に扱えるようになります。
例えば、映画レビューシステムでは「映画」と「レビュー」という2つの主要な要素があります。アソシエーションを使うことで、これらの関係を簡単に表現し、操作することができます。
## 目次
1. [has_many](#has_many)
2. [b
【Ruby on Rails】学習メモ:配列のエラーにはまった話
今回は業務でRuby on Railsを用いたコーディングをするにあたって行き当たったエラーに関するメモを共有します。
初心者がこんなところでつまずいたよ、という記録を残していきたいと思いますので、近い境遇の方の助けになれば幸いです。# 筆者のステータス
Ruby on Railsの初心者(学習中)
JavaやPerl等についてはいくらか経験あり# 実現したかったこと
次のような構造の”data”から、配列”hogeDetails”に含まれる”hoge_id”を取得したいと考えました。
“`Ruby
data —– id
|— hogeDetails
|— hoge_id
|— hoge_name
…
“`# 今回行き当たったエラー
上記の目的を実現するために、「data以下の要素を順に指定していけばよい」と考え、次のような実装を行いました。
“`
hogeId = data.hogeDetails.hoge_id
gem が build できなかった (MAKEDIRS)
## とある gem がビルド できなかった.
具体的には,`Makefile` で `MAKEDIRS` が動いてなかった
“`make:Makefile
(snip)
MAKEDIRS = /usr/local/bin/gmkdir -p
(snip)
“`“`
$ ls -l /usr/local/bin/gmkdir
lsd: /usr/local/bin/gmkdir: No such file or directory (os error 2).
“`どこかのタイミングで coreutils を消してしまったのかもしれない.
## これの由来を確認すると
“`rbconfig.rb
CONFIG[“MAKEDIRS”] = “/usr/local/bin/gmkdir -p”
“`ということで,おそらく ruby-build 時に固定されているものみたい.
ビルドしなおすと,存在するパスになった.
“`rbconfig.rb
CONFIG[“MAKEDIRS”] = “mkdir -p”
“`ビルドしなおすのが面倒なときは
配列の要素を削除する方法
## 要素の値を指定して削除する
deleteメソッドを使用することで、引数の値と一致する要素だけを削除することができる。
“`
a = [1,3,5,6,1,7]
a.delete(1)
a
=> [3, 5, 6, 7]
“`
## 添え字から削除する
delete_atメソッドを使用することで、特定の位置にある要素だけを削除することができる。
“`
a = [1,3,5,6,1,7]
a.delete_at(0)
=> 1
a
=> [3, 5, 6, 1, 7]
“`
## 繰り返し処理を行い、条件に当てはまるものを削除する
delete_ifメソッドを使用することで、配列の要素を1つずつ取り出し、条件に当てはまるものだけを削除することができる。
例えば、配列の中から、偶数の要素を削除するコードは以下のようになる。
“`
a = [2,3,6,3,2,8,9]
a.delete_if do |n|
n.even?
end
=> [3, 3, 9]
“`
処理の流れとしては、配列の要素を1つずつ取り出し、ブロック変数nに渡す。
n.even?の戻り値が真である場合
【Docker Storage】バインドマウントでホストマシンのファイルを Ruby コンテナで実行する
# はじめに
この記事では、Docker のバインドマウント機能を利用して、ホストマシンのファイルを Ruby コンテナで実行する手順について記載します。
バインドマウントへの理解促進の一環で行っています。https://docs.docker.com/storage/bind-mounts/
# バインドマウントとボリューム
バインドマウントと似た概念として、ボリュームがあります。https://docs.docker.com/storage/volumes/
両者ともデータをコンテナとは別に管理するという役割を持っていますが、データの保存先が異なります。
– バインドマウント : ホストマシンのファイルやディレクトリ
– ユースケース : ホストマシンのエディタでファイルを編集して、コンテナで実行する
– ボリューム : ホストマシンの Docker のストレージ
– ユースケース : データベースサーバーのデータを保持する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws