Ruby関連のことを調べてみた2020年12月23日

Ruby関連のことを調べてみた2020年12月23日
目次

Railsチュートリアル/インデックスをつけることの意義

はじめに

こんにちは.初投稿です.自分の勉強のメモ用です.初心者なので,間違っているところなどあると思います.コメントでご指摘いただけるとありがたいです.

疑問点

rails tutorial でたびたび出てきていたテーブルにインデックスを振る,という操作が一体何のために行われているか?が疑問でした.自分の疑問点としては,「インデックスとは」でググると,「データ検索を行う際に無駄が多いため,索引としてインデックスを追加する」という趣旨の文がたくさん出てきたのですが,これがよくわかりませんでした.インデックス?インデックス番号を使ったのではだめなのか?と感じていました.具体的には以下のようなコードがある場合です.

Railstutorial 第4版 (Rails5.1対応) リスト14.1

“`db/migrate/[timestamp]_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.1] def change create

元記事を表示

Homebrew + rbenv + ruby-build の関係性(後編)実際にrubyとRailsの導入もできます!

前回の記事ではbrewでインストールしたプログラムが`/usr/local/Celler`ディレクトリなどに入りシンボリンクを作成することでパスが通ること、各ディレクトリ構成について説明しました。今回は実際に`rbenv`と`ruby-build`をインストールして、それぞれのコマンドで何をしているのかを説明していきます。

# rbenv, ruby-buildのインストール
まずはbrewを最新の状態にしておきます。

“`
% brew update
“`

次に`rbenv`と`ruby-build`のインストールです。ruby-buildはrbenvのプラグインの1つです。rbenv installというRubyのバージョンをインストールするコマンドを提供しています。rbenvをインストールする際に、セットでインストールします。

“`
% brew install rbenv ruby-build
“`

## RBENV_

元記事を表示

Railsの賞味期限を延ばす方法をまとめてみる

## はじめに

年末になりアドベントカレンダーが盛り上がってますね。Railsのエントリーも賑わっています。
以下のエントリーに触発されて、大規模な開発になっても少しでもうまく開発が進む方法まとめてみようと思いました。

https://blog.unasuke.com/2020/i-have-to-learn-those-things-in-the-future/

## 考え方

この記事では、DDDやアーキテクチャについて議論は取り扱わず、具体的なRubyのコーディング方法を中心にまとめていきます。
まず、原則的になぜRailsが大規模に向かないのか?開発が進むにつれしんどくなっていく理由について考えてみます。

大規模開発に向かない理由:
– **クラスやオブジェクトの参照箇所が正確に把握できない。このため、リファクタリングはもちろん機能追加などがやり辛く、開発のスピード・品質が悪くなっていく。**

こんな経験ありませんか?
– Gemのソースコードを追っ

元記事を表示

Payjp v2 ざっくり実装

#最近Payjpのv2なるものがリリースされたらしく、Payjp側もセキュリティの向上のためv2の使用を推奨しているらしいです。
少し前に質問があり、気になったので実装してみました。忘れないようにメモとして記事作りました。
細かい説明は省きます。リファレンス見れば誰でも簡単に実装できます。

# v1との違いは?
“`
v1ではトークン化APIのみを提供しており、カード情報入力フォームは加盟店側で用意する必要がありました。

しかしより安全なクレジットカード商取引のために、最新のPCI-DSSでは、カード情報入力フォームを決済代行業者側で用意することが求められています。
で、
payjp.js v2では、これらのフォームを弊社ドメインのiframe内で用意し、かつ独自スタイルの適用・イベント監視などv1で実現できた機能を提供いたします。 加えて、カード番号入力時の自動フォーマットやレスポンシブデザインなど、ニーズの高かった機能をデフォルトで提供致します。
“`
との事です。Payjp側で用意された入力フォームを使えるので、わざわざ作らなくて良い感じらしいですね。
ところでPCI

元記事を表示

Ruby学習#1 Introduction

本日の学習内容

1.introduction 〜 3.Mac Installaion 既にインストール済 スキップ

4.Hello World

 ●ATOMのインストール方法
ATOMのサイトへ https://atom.io/
  MAC版インストール (既にインストール済、後日手順化)

 ●giraffe.rb を作成
  print “Hello World”

●明日やること
 ・Rubyの実行環境を整備する。
 ・学習を阻害する要因を消し去る(スマホのyoutubeオフライン動画消す)
 ・既に基礎学習を終了しているため、プログラミングノートの作成に注力し、
  あまり時間をかけないこと。
●環境デザイン
 ・外出先でpcなくてもpaizaを使い学習効率高める
  https://paiza.io/projects/MdeZlhs0J8LKokYZZSk8WA
 ・スマホで脳ジャックされるの最小限にするため、
  不要なアプリを消すことと、YouTubeのオフライン保存動画消しまくる

元記事を表示

Railsのバリデーション設定でハマった話

こんばんは
アロハな男、やすのりです!

今日はポートフォリオ作成中にモデルのバリデーションでハマった話をしていきたいと思います!!

もしかしたら明日は我が身かも…?

#結論
Userモデルのパスワードへのバリデーションは

“`ruby
on: :create
“`
を使おう!

#ハマった時の状況
え、いやどういうこと…?
となってしまうと思うので、順を追って説明していきます。

まずポートフォリオではユーザーが会員登録された場合は、専用のマイページがあったり口コミ投稿ができたりする機能をRailsのGemである`devise`で作成していました。

そんな機能の中で、マイページで行える**『自身のユーザー情報変更機能ページ』**で事件が起こりました…

#何があったのか?
ユーザー情報の変更ページではユーザー名やアイコン画像等を変更することができるページなんですが、`devise`を使用していると通常は変更の際に毎回パスワードの入力が必要になります。

ただ、『少しの変更で毎回パスワードを入力するのは面倒だなぁ…』という人のために、パスワードを入力しなくて

元記事を表示

[Ruby]作成されてから〇〇以上経ったレコードのみ取得・選択する方法

#作成されてから〇〇以上経ったレコードのみ取得・選択する方法

##結論
`Record.where(‘created_at < ?', 1.minute.ago).order(created_at: :desc)` 重要なのは`('created_at < ?', 〇〇)` 〇〇に好きな条件を入れるだけ。 1時間前なら`1.hour.ago` 1日前なら`1.day.ago` ##質問 クオーテーション使わない方法やベタープラクティスってありますか? 意外と見つけづらい情報でした。。。

元記事を表示

クラスとインスタンスを俗世もので例えてみた

# クラスとインスタンスを俗世もので例えてみた

rubyを行う上で `class` や `instance` って切っても切り離せなくて、かなり大事なことなのは初心者の私でも理解できる。(rubyしか勉強してないから他はわからん)
でも文章で理解できても、私はコードにしようと思うと書けないので、わかってないと思うんですね。
だから自分が理解しやすいように、俗世のもので例えたいと思います。

## そもそもクラスとインスタンスって?

classとは設計図のようなもので、それ自体には中身がないもの。
instanceはそのclassをもとにして作られた実体、データ。クラス名.newで生成できる

クラスメソッドはクラスから作られた全ての個別の情報によらず、共通の結果を返す動作を定義するメソッド。
インスタンスメソッドはインスタンスの持つ個別の属性に対して、別々に設定できるメソッド
インスタンス変数を用いることで、個々のインスタンスによって別々に設定した属性値を設定できる。

“`ruby
class クラス
def self.メソッド名 #クラスメソッド
処理
end

元記事を表示

【Rails】 LIKEで複数の値で検索する方法

# LIKEで複数の値で検索する方法
LIKEで複数の値で検索する方法をメモとして残します。

“`gem ‘activerecord-like’“`を使えばもっと簡単にできるのですが、別の方法として実装してみました。

* https://github.com/ReneB/activerecord-like

#

“`ruby

scope = User.all
names = [‘yama’, ‘mae’]
search_sql = []

names = names.map do |n|
search_sql.push(‘name like ?’)
“%#{name}%”
end

scope = scope.where( search_sql.join(‘ or ‘), *names )
“`

元記事を表示

Homebrew + rbenv + ruby-build の関係性(前編)

# はじめに
最近rubyの管理を`rbenv`から`anyenv`経由で`rbenv`をインストールする形式に変えようと思っていました。というのも、`.zshrc`(bashを使う人は`.bash_profile`)にanyenvのパスを通すだけで済むのでファイルをきれいに保てるというのが1番の理由です。その移行方法について調べている際に「rbenvをよくわかってなかったなあ」と感じたので記事を書くことにしました。また、今回の記事は「`homebrew`でインストールしたとき」を想定しています。

# brewでインストールしたものはどこにある?
まず私はこんな基本的なこともわたしは理解していませんでした。homebrewでインストールしたものは`/usr/local/Celler`に入るようになっています。「`/usr/local/Celler`にパスを通したことなんてない!」と思ったのですが、homebrew の仕組みにしたがって、適切なバージョンの実行可能ファイルに `/usr/local/bin` からのシンボリックリンク(ショートカット)が作成されるみたいです。つまり、`/

元記事を表示

【Rails】 姓・名それぞれがDBのカラムとして格納されているレコードの検索方法

# 姓・名それぞれがDBのカラムとして格納されているレコードの検索方法

すでにたくさんの記事が出ていますが、自分がよく使うものを忘れないようにメモしました。

#

“`ruby
name = ‘山田 太郎’
scope = User.all

if name.include?(‘ ‘) || name.include?(‘ ’)
# 全角スペース を 半角スペース へ置き換え
name = name.tr(‘ ’, ‘ ‘) if name.include?(‘ ’)
# 姓・名を分割
last_name, first_name = name.split(‘ ‘)
# and 条件で検索
scope = scope.where(‘last_name LIKE ? AND first_name LIKE ?’, “%#{last_name}%”, “%#{first_name}%”)
else
# 姓名どちらかのみ入力されている場合
scope = scope.where(‘last_name LIKE :name

元記事を表示

Ruby のメソッド名の ! の有無は破壊的/非破壊的を意味する,わけじゃない

Ruby の初心者向け記事に数限りなく書かれてきた誤解の一つに,メソッド名末尾の `!` についてのものがあります。
誤りにはいくつかのバリエーションがありますが,最も極端なものは

* `!` の付いたメソッドは破壊的
* そうでないメソッドは非破壊的

というものでしょう。

メソッドが破壊的というのは,レシーバーであるオブジェクトに変化を与えるということですね。
たとえば

“`rb
“Ruby”.upcase
“`

の場合,`upcase` メソッドは非破壊的で,レシーバーには変化を与えません。その代わり,レシーバーを元にしてそれを大文字化した,内容が「RUBY」であるような String オブジェクトを新たに生成して返します。

一方,

“`rb
“Ruby”.upcase!
“`

の場合,新たなオブジェクトの生成は行われず,レシーバー自体の内容が大文字化されます。
返り値は,実際に変換が行われた場合(1 文字でも小文字が含まれていた場合)は `self` であり,そうでない場合は `nil` です。

この例ではまさに

* `!` の付いたメソッドは破壊的

元記事を表示

【Ruby】 繰り返し処理

論理的思考強化の為、ドリルの復習をしています。
初学者のため、何かお気づきの点がありましたらご教示いただけますと幸いです。
また今回は私の思考の順番で解説しています。
初学者の俯瞰できていない考え方で、本来の考え方とは前後している可能性が高いので、そちらはご了承ください。

## 問題
1〜10までの数値を順番に足し合わせて、最後に全て足した結果をターミナルに出力するプログラムを書いてください。
条件:必ずtimes文を使用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/885782/66045230-33ce-2654-dee3-f277c2237191.png)

## 回答
“`ruby:ruby.rb
sum = 0 #③

10. times do |i| #①
sum += i + 1 #②
end

puts sum #④
“`
## 解説
今回は4STEPで考えていきます。

①まず10回の繰り返し処理を行いたいので、条件にあるよう

元記事を表示

【Rails】 日時がそれぞれのカラムを持っているときの検索方法

# 日時がそれぞれのカラムを持っているときの検索方法

日付および時間がそれぞれ文字列としてDBに格納されている時の検索方法をメモとして残します。

#

“`ruby
start_datetime = ‘2020/12/22 23:35’
scope = Post.all

start_date, start_time = start_datetime.split(‘ ‘)
# 該当する日付以降のものを抽出
scope = scope.where(‘start_date >= ?’, start_date)
# start_date が等しい時の該当しない時間を除去
scope = scope.where.not(‘start_date = ? AND start_time < ?', start_date, start_time) ``` # 参考 * Rails における内部結合、外部結合まとめ * https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30

元記事を表示

Stripe Billing を使ってサービスに月額課金のシステムを組み込む際に必要な実装ってめちゃくちゃ少ない

[Ateam Group Manager & Specialist Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ateam)の23日目は
Increments株式会社の @phigasui が担当します。

近年よくみる、月額課金サービス。
単発購入の決済のシステム導入に比べて実装すべき決済にまつわる機能が多くて大変なイメージないですか?

月額課金のサービスでは下記機能が必要とされると思います。

– トライアル期間の設置
– 決済情報の登録、変更
– 決済の履行
– 決済できない場合のアカウント停止
– 領収書の送付
– 決済履歴の表示
– プランの変更
– 解約
– 返金

細かい要素はまだあるもののこれらがあれば十分です。
一見、機能が多く実現が大変そうですが、Stripe Billing とそのうちの機能の Stripe Customer Portal を活用すればほぼ実装なしに実現できます。

## まず、Stripe Billingとは
よくある決済システムでは決済の手段と入金しかサポートして

元記事を表示

【Rails】(補足)フォロー機能を実装

# 概要
以下の参照記事にしたがって進めたら、フォロー機能を実装することができました。

実装方法の大半は参照記事に書かれているので、そちらをご覧いただければと思います。

本記事では補足内容を備忘録として記録いたします。

# 参照記事
↓以下の記事にお世話になりました。ありがとうございます。

– Railsでフォロー機能を作る方法
https://qiita.com/mitsumitsu1128/items/e41e2ff37f143db81897

# 完成イメージ
今回は、写真投稿アプリを題材に、フォロー機能を作成し、ユーザーページと写真詳細ページにフォローボタンを設置する方法を説明します。

– ユーザーページ
[![Image from Gyazo](https://i.gyazo.com/2028f80ce141a5fd3cd5397d930c0351.gif)](https://gyazo.com/2028f80ce141a5fd3cd5397d930c0351)

– 写真詳細ページ
[![Image from Gyazo](https://i.gyazo.

元記事を表示

Ruby の”(ダブルクォーテーション) と ’シングルクォーテーションの違いについて

前提:
ほとんどの場合、大きな違いはでない。

ダブルクォーテーションのみ式展開ができる
=シングルクォーテーションだとできない

>>’#{foo} bar’
⇨ “\#{foo} bar”

ではシングルクォーテーションを使う場合はあるのか

結論あります。

具体的には、
シングルクォートは、入力した文字をエスケープせずに「そのまま」保持するときに便利です。
例えば「バックスラッシュ」の文字は、改行文字 \nと同様に多くのシステム上で特殊な文字として扱われます。
なお、シングルクォートで文字列を囲めば、簡単にバックスラッシュ文字のような特殊文字をそのまま変数に含めることができます。

>> ‘\n’ # ‘バックスラッシュ n’ をそのまま扱う
=> “\\n”

元記事を表示

thorによるCLI作成

\![ruby-2.7.0p0]()

本ページは大学講義における個人メモです

# thor

## thorとは

CLIコマンドを作成することができるツール。gitなどもこれで開発されているらしい。thorのGitHubは[ここ](https://github.com/erikhuda/thor)

## CLIコマンドの作りかた

まず、必要なものを入れる

“`
gem install bundler
gem install thor
“`

プロジェクトを生成

“`
bundle gem -b
“`

“は以下、 `hoge` で書いていく

作成されたディレクトリの中にある `hoge.gemspec` をエディタで開き、TODOになっているところを適切に書き換える。

権限を与えて、install

“`
chmod a+x exe/hoge
bundle install
“`

`lib/hog

元記事を表示

【Ruby】特異メソッドと特異クラス

# 特異メソッドと特異クラス

特定のオブジェクトのためだけのメソッドやクラス、というRubyの概念。

## 特異メソッド

– 特異メソッド `build_greeting` は、定義時に変数 `message` が参照していた文字列オブジェクトにだけ属する。

“`rb
message = “Hello” # 文字列オブジェクト
def message.build_greeting(target)
“#{self}, #{target}.”
end
message.build_greeting(“world”) # => Hello, world.
message2 = “Hello” # 値は同じだが異なるオブジェクト
message2.build_greeting(“world”) # => NoMethodError
“`

### Singletonパターン

– そのクラスのインスタンスが1つしか生成されないことを保証するGoFのデザインパターン。

“`rb
CENTRAL_REPOSITORY = Object.new
def CENTRAL_RE

元記事を表示

オブジェクト指向プログラミング とは? 〜 初心者編 〜

「**オブジェクト指向プログラミング**」という言葉はよく聞きますが、いまいち理解できていなかったので調べて見ましたが、あくまでプログラミング初心者の備忘録になるので間違いなどありましたら、どんどんご指摘願います。

またオブジェクト指向について説明している技術書やWebサイトは数多く存在し、どの説明もバラバラ、答えはエンジニアによってもバラける。
明確な答えがないのだから、ざっくり雰囲気を理解しておけばいい100%理解しようとするとよくわからなくなるし、あとは自分の成長と共に、理解が進んでいき、自分の中で定義ができるようになる。
というスタンスなので、現時点では100%理解を求めていないです。
以上宜しくお願いいたします。

* * *

### オブジェクト指向とは

まず始めに、オブジェクト指向とは、特定のプログラミング言語や手法の名前ではなく、プログラミングを行う際の考え方。「**概念**」ということである。
※概念→物事や対象を丸ごとひっくる見たときの大まかな理解のこと。思考において把握される、物事の「何たるか」という部分。

wikipediaで調べると

`オブジェクト

元記事を表示

OTHERカテゴリの最新記事