Ruby関連のことを調べてみた2022年04月15日

Ruby関連のことを調べてみた2022年04月15日

WHERE A and (B or C)をActiveRecordで記述する方法

Railsアプリケーション開発中に、`WHERE A and (B or C)`のようなSQLをActiveRecordのデータアクセスメソッドで書くときにどうすれば良いのか少しハマったのでメモとして残します。

“`sql:SQL
SELECT *
FROM model
WHERE A and (B or C) ;
“`

# 結論
`merge`メソッドを使用する。
括弧に該当するメソッドが`merge`メソッドとなる。
“`ruby:ActiveRecord
Model.where(A).merge(where(B).or(where(C)))
“`

# 例: ポケモン
例えば、こんな感じのポケモンテーブルがあったとする
“`ruby:db/migrate/pokemon.rb
class Pokemons < ActiveRecord::Migration[5.2] def change create_table :pokemons do |t| t.string name t.string type end en

元記事を表示

サポートモジュールを使用したテストコードのまとめ

# アウトプット
サポートモジュールとは、RSpecに用意されている、メソッド等をまとめる機能。

#### 実装の手順
① specディレクトリ配下にsupportディレクトリを作成し、その配下に`メソッド名.rb`のファイルを作成する
###### (例)spec/support/sign_in_support.rb
“`ruby
module SignInSupport
def sign_in(user)
visit new_user_session_path
fill_in ‘Email’, with: user.email
fill_in ‘Password’, with: user.password
find(‘input[name=”commit”]’).click
expect(current_path).to eq(root_path)
end
end
“`
② サポートモジュールを読み込める設定をする
Rspecを用いてRailsの機能をテストするときに、共通の設定を書いておくファイル`spec/rails_hel

元記事を表示

Rubyで気象庁過去データからのスクレイピング

# 今回の目的
職場の農業法人で25ha全43枚の畑の管理を任されていまして、枚数と種類が多すぎて作業の管理が不可能でした。
そこで、定植日からの積算温度(1日の平均気温を積算した値)一瞬で確認できるものがあれば便利だと思い作ってみました。

# なにをするのか

https://www.data.jma.go.jp/obd/stats/etrn/index.php

こちらから情報を頂いてきます。天気予報のAPI(ぽいもの)は配信されているようですが、過去の気象データはこの表かcsv形式でしか配信されておりません。
![スクリーンショット 2022-04-14 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512596/745abb7c-9c96-538d-d4a2-803d5b87dd28.png)

この平均気温の行を取得してきて合計します。(0度以下は0として扱う)
Mechanizeを使ってスクレイピングします。

# ソースコード

“`ruby:
require “Mecha

元記事を表示

初学者:Rubyの初歩的なコードをまとめてみた。

超初歩的なRubyのコマンドを学ぶ際のアウトプット&備忘録としてまとめていく。
### greetingを使用して“Hello World”を表示
“`
greeting = “Hello Would”
puts greeting
“`

## 配列

### 配列の中を並び替えて大きい順に表示
“`
numbers = [2, 9 ,1, 5, 3, 2, 8]
puts numbers.sort.reverse
“`

### 配列の中をシャッフルして表示
“`
numbers = [2, 9 ,1, 5, 3, 2, 8].shuffle
puts numbers
“`
### 配列の中の合計を表示
“`
a = [2, 9 ,1, 5, 3, 2, 8]
puts a.sum
配列の中の平均値を表示(少数)
a = [2, 9 ,1, 5, 3, 2, 8]
puts a.sum.to_f / a.size
mapを使った配列
numbers = [100, 200, 300, 400]
results = numbers.map do |num

元記事を表示

Ruby メモ

# メモ Ruby
* 次にふれる機会のための防備録的に。。

### 規約

– キャメルケース
– クラス名、モジュール名
– スネークケース(全部小文字)
– メソッド名、変数名
– 全部大文字のスネークケース
– 定数
– `;` は1行内に複数文書く場合には文の区切りに使用できるが、めったに使わない。
– メソッド名末尾の!
– `!` はメソッド名の一部。オブジェクトの内容を変更するメソッド名には `!` を付ける
– メソッド名末尾の?
– `?` はメソッド名の一部。真偽値を戻す場合はメソッド末尾に `?` を付ける

### 変数

– `_` または小文字アルファベット が先頭
– ローカル変数
– `$` が先頭
– グローバル変数
– `@@` が先頭
– クラス変数
– クラス変数はクラス定義の中で定義され、クラスの特異メソッドやインスタンスメソッドから参照・代入できる
– クラス変数の値はクラスのすべてのインスタンスで共有する
– mute

元記事を表示

Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)の倒し方

Action_Mailerを使い、gmail経由でメール送信したかったが、`Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)`が連発してのでメモリます。

## 結論

user_name と password は環境変数におくべし。

## 実際のコード

ガイドにある通りconfig/environments/development.rb に以下を追加

“`ruby
# MailCatcher Configuration
config.action_mailer.raise_delivery_errors = true

config.action_mailer.perform_caching = false

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { address: ‘smtp.gmail.com’

元記事を表示

RSpecのテストコードの大まかな流れ

# アウトプット

各テストにおいて、必ず踏むステップは下記の通りである。

1. テストの前に`before`を使用してFactoryBotの生成

2.
[モデル単体テスト]
example毎にインスタンスの値を変更

[コントローラー単体テスト]
`get`でリクエストを送りたいパスを指定

[結合テスト]
`visit`で移動したいページに遷移

3. expectation構文で挙動の確認

4. bundle exec rspecコマンドでテストコードの実行

# 学んだこと
RSpecのテストコードは、種類によって記述も変わるが、
大まかな流れや共通点を見つけると、「次に何を記述すべきか」が掴みやすくなった。

元記事を表示

【LeetCode】110. Balanced Binary Treeを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの110. Balanced Binary Treeを解いていく。

## 問題文を和訳
– 二分木が与えられた場合、それが高さのバランスが取れているかどうかを判断します。
– この問題では、高さのバランスが取れた二分木は次のように定義されます。
– すべてのノードの左右のサブツリーの高さが1以下しか異なる二分木。
– Input: root = [3,9,20,null,null,15,7]
– Output: true

## 回答
“`110_BalancedBinaryTree.rb
def is_balanced(root)
return depth(root) >= 0
end

def depth(root)
if root == nil
return 0
end
left = depth(root.left)
right = depth(root.right)
if (left – right).abs > 1 || left < 0 || right < 0 retu

元記事を表示

Mailerでmissing templateになってしまった

![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525610/951586bb-b754-8987-fa59-ba2c02f6e599.png)

https://qiita.com/ki_87/items/67f8965e8de17e95ac1c

コチラのサイトを参考にさせていただきメールの送信機能を実装しました。
ですが、上記のエラーが出てしまいました。なぜ。。。。

###### こいつは馬鹿です

いや誤字はない。どこが。。。おかしいんだ。。。

###### こいつは馬鹿です

何で!なんで!お父さん帰ってこないんだよ!!

###### ※関係ありません

答えは簡単。
彼は見落としていました。

~~~view/contact_mailer/send_mail.text.erb
===============================
<%= @mail_title %>
===============================

元記事を表示

SSLクライアント証明書を使ってRubyのFaradayで通信する方法

詰まったのでメモします

# 前提
– Ruby: 2.7
– Faraday: 2.2.0

# コード

“`ruby
# urlは通信先のURL
url = ‘https://example.com’
connection = Faraday.new(url: url) do |faraday|
faraday.request :url_encoded
faraday.adapter :net_http
# ファイル名は各自のファイル名
faraday.ssl.client_cert = OpenSSL::X509::Certificate.new(File.read(‘ssl_client.crt’))
builder.ssl.client_key = OpenSSL::PKey::RSA.new(File.read(‘ssl_client.key’))
end

connection.get(url) do |req|
req.headers[‘Content-type’] = ‘application/json’
end

元記事を表示

【Docker】駆け出しエンジニアがDocker公式チュートリアルに躓きまくった件

可能な限りDocker公式が提供しているチュートリアルに沿って、Ruby on rails + MySQLの環境構築を行います。

## はじめに
こんにちわ、2022年4月よりエンジニアとして働き始めたばかりのUdai(ゆうだい)です!

今回は、Docker公式チュートリアルを行った際に大量のWorningやErrorに苦しんだので、これからチュートリアルに訪れる初学者の同士が同様に躓かないようにと思い筆を取りました。

如何せん、私はまだまだ駆け出しのエンジニアですので、本記事はDockerを知らない人や名前だけは知っているよといった初学者向けの記事となっております。そのため、粒度はかなり細かいものとなっております。

また、それでも一読してくださる寛大なシニアなエンジニアの先輩方は記事の内容に誤りがございましたら、遠慮なく指摘・訂正していただけると幸いです。

※ 注意点
– チュートリアルとデータベースが異なります。(PostgreSQLからMySQLへ変更)
– 手早く同上の環境構築を行いたい方は他の素晴らしい記事を参照してください。

## 対象
– 実際にDockerを

元記事を表示

Ruby 無限ループで each_with_index のようなカウント数を得る

# コード例

“`rb
(1..Float::INFINITY).each { |i| p i }
“`

# 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7d8aec45-3622-31d1-7825-34e98926fba3.png)

元記事を表示

Rubyでじゃんけんを作る プログラングの練習

# 何?

– 人数を指定してじゃんけんをする
– 勝敗がつくまでじゃんけんを続けて、勝敗がついたら試行回数を数える

# コード

“`ruby

variations = [“G”,”C”,”P”]

MEMBER = ENV[“MEMBER”]&.to_i || 3

puts “JANKEN!”
puts “#{MEMBER} members”

try_count = 0

(1..).each do |i|
try_count = i
cards = []

MEMBER.times do
cards.push variations.sample
end

puts cards.join(” “)

# 勝敗が決まった場合
# じゃんけんで勝敗が決まるのは、手の種類が2個の場合である
if cards.uniq.count == 2
break
end
end

puts “#{try_count} tried”
“`

# 実行例

![image.png](https://qiita-image-store.s3

元記事を表示

FactoryBotを使用した2通りのインスタンス生成

# アウトプット
`FactoryBot.build(:モデル名)`は、ActiveRecordのnewメソッドと同様の意味を持つ。
新しいインスタンスを生成し、それに対するテストを行う際に用いる。

`FactoryBot.create(:モデル名)`は、ActiveRecordのcreateメソッドと同様の意味を持つ。
既にデータベースにインスタンスが登録されている状態で、テスト行う際に用いる。

# 学んだこと
buildメソッドは、主に下記のテストで使用する。
– ユーザー機能モデル単体テストコード
– データ機能モデル単体テストコード
– ユーザー新規登録機能結合テストコード

createメソッドは、主に下記のテストで使用する。
– データ機能コントローラー単体テストコード
– ユーザーログイン機能結合テストコード
– データ機能結合テストコード
– コメント機能結合テストコード

元記事を表示

Railsのbinding.irbで処理を止めて変数に代入しようとするとArgumentErrorがでる

# エラーの説明
動作などを確認する際にbinding.irbで処理を止めて変数に値を代入するような処理を行うと
このようなエラーが表示される。
エラーが表示されても変数の代入は行われるし、
binding.irbで処理を止めない場合も問題なく処理は行われる。
なお、binding.irbを記載する箇所、変数や値はどれでもエラーが出るので関係ない模様。
“`
irb:001:0> a = 1
/Users/ユーザーネーム/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/hirb-0.7.3/lib/hirb/view.rb:186:in `output_value’: wrong number of arguments (given 1, expected 0) (ArgumentError)
from :5:in `irb’

元記事を表示

【Rails】loggerの出力をminitestでテストする方法

コントローラのテストをする際に、logger出力のテスト方法につまったので、備忘録として残します。他にいい方法があれば教えていただけると幸いです。

## バージョン

Rails 6.1.5

## 実装方法

適当なアクションに遷移した時にlogを吐く場面を想定します。

“`ruby
class XXXController < ApplicationController def index logger.info "通ったで" #ここを検出したい end end ``` ログの内容をテストします。 ```ruby # stubを使用するために必要 require 'minitest/mock' # 略 test 'logger.info を出力' do http_method = lambda { get staffs_path } logs = get_logs(http_method) expected_message = "通ったで" assert_log(logs,expected_message) end # 略 #

元記事を表示

Gem 名の命名規則について

ユーザに Gem の読み込み方針を提示するために、命名規則が推奨されている

https://guides.rubygems.org/name-your-gem/

実際には、↑ の命名になっていない Gem もあるけど、デファクトスタンダードとして知っておく

# ① クラス・モジュール名に複数単語が含まれる場合
単語を `_` 区切りにする

require 先と同じ表記になるので、ユーザーフレンドリー

例えば、

– Gem 名は `ruby_parser`
– require 先は `〃`
– クラス・モジュール名は `RubyParser`

# ② 別の Gem を拡張する場合
拡張元を `-` 区切りにする

[require先は `/` 区切りとなり](https://ruby.studio-kingdom.com/bundler/guides/bundler_setup#:~:text=%E9%8B%AD%E3%81%84%E8%AA%AD%E8%80%85%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81rack%2Dc

元記事を表示

【LeetCode】108. Convert Sorted Array to Binary Search Treeを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの108. Convert Sorted Array to Binary Search Treeを解いていく。

## 問題文を和訳
– 要素が昇順でソートされる整数配列numsが与えられた場合、
– それを高さバランスのとれた二分探索木に変換します。
– 高さバランスのとれた二分木は、
– すべてのノードの2つのサブツリーの深さが1つより大きく異なることのない二分木です。
– Input: nums = [-10,-3,0,5,9]
– Output: [0,-3,9,-10,null,5]
– Explanation: [0,-10,5,null,-3,null,9] is also accepted:

## 回答
“`108_ConvertSortedArraytoBinarySearchTree.rb
def sorted_array_to_bst(nums)
if nums.length <= 0 return nil end middle = nums.length / 2 root

元記事を表示

rails6 systemdの書き方について

# はじめに
初めてsystemdを書いた時の自分への戒めとして、こちらを書こうと思います。

# 環境
ruby 3.0.2
rails 6.1.4
puma 5.4

# 参考URL
https://www.rochefort.dev/posts/puma-systemd/

# エラー
“`
$ sudo journalctl -fp err
systemd:Failed at step CHDIR spawning /home/ec2-user/.rbenv/shims/bundle: No such file or directory
“`
単純に「bundleのファイルかディレクトリがありません」と思い確認してみた所、存在しています。
# 対象コード
“`
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]

Type=notify

WatchdogSec=10

User=tomo

WorkingDirectory=/var/www/my_app/current

Environ

元記事を表示

【備忘録】Railsリレーション検索・作成総集

– ユーザー VS 性別(1:多)
– ユーザー VS スキル (多:多)

## 1:多(検索)
“`
User.find_by(sex_id: 1)
“`

## 多:多(検索)
“`
User.includes(:skills).where(user_skills: { skill_id: 1 })
“`
※user_skillsは中間テーブル

## 多:多(作成)
“`
User.new(skills: [Skill.find(1)])
“`

元記事を表示

OTHERカテゴリの最新記事