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

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

Ruby と crystal で解く AtCoder ABC248 C-D

# はじめに
AtCoder さん、ありがとうございます。
# C – Dice Sum
https://atcoder.jp/contests/abc248/tasks/abc248_c

動的計画法を応用して解きました。
## Ruby
“`rb
n, m, k = gets.split.map(&:to_i)
MOD = 998244353
dp = Hash.new(0)
dp[0] = 1
n.times do |i|
dp2 = Hash.new(0)
(1..m).each do |x|
dp.keys.each do |key|
if key + x <= k dp2[key + x] += dp[key] dp2[key + x] %= MOD end end end dp = dp2 end puts dp.values.sum % MOD ``` 動的計画法では、配列をコピーしたりしますが、`Hash#keys`でコピーしている様な感じです。 ## crystal ```cr

元記事を表示

fileterメソッドを使用してN+1問題を解決した

次の状況でN+1問題が発生しておりました。その解決方法になります。

“`ruby:model/model1.rb
class:Model1
has_many :model3s,
has_many :model2s, through: :model3s
“`

“`ruby:model/model2.rb
class:Model2
has_many :model3s,
has_many :model1s, through: :model3s
“`

“`ruby:model/model3.rb
class:Model3(Modle1とModle2の中間テーブル)
belongs :model1
belongs :model2
“`

“`ruby:controllers/sample_controller.rb
@model1 = Model1.eager_load(:model3s)
“`

“`ruby:views/sample.html.erb
# model2_idはループで回される値
   @model1.where(model3s: { [

元記事を表示

【Rails】cocoonを用いたデータを表示する方法

# cocoonとは?
cocoonとはフォームの追加や削除の実装を行う時とても便利なgemです。
個人的には以下の記事が大変参考になったのでこちらをご参照していただければと思います。

https://qiita.com/kmjooh/items/a1613531873a22fa7862

# cocoonで保存したデータをどうやって表示するのか?
ここからはオリジナルアプリの制作時に実装した方法を紹介します。オリジナルアプリは筋トレ日記です。

## ゴールは?
ゴールとしては以下のような表示です
[![Image from Gyazo](https://i.gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012.png)](https://gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012)
これはオリジナルアプリの一覧表示の一部ですが、種目・重量・回数・セット数はcocoonを用いてフォームを追加・削除したりして複数のデータを保存できるようにしています。

## まず日記の一覧表示はどのように実装されているのか?

元記事を表示

【Rails】Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

## 開発環境
Rails6.1.4
Ruby3.0.1
macOS Monterey 12.2.1

## エラー内容

gem(rinku)を“`bundle install“`しようとしたら、いきなりエラーが発生してインストールできなくなった🤯

“`terminal:terminal
Installing rinku 2.0.6 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory: /Users/apple/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/rinku-2.0.6/ext/rinku
/Users/apple/.rbenv/versions/3.0.1/bin/ruby -I /Users/apple/.rbenv/versions/3.0.1/lib/ruby/3.0.0 -r
./siteconf20220416-552-xpdj2a

元記事を表示

【Rails】booleanは実質メソッド!?と感じたこと

# はじめに

Railsアプリケーション開発中にbooleanのカラムに対してこんなコードに遭遇した

“`ruby:db/migrate/create_post.rb
class Posts < ActiveRecord::Migration[5.2] def change create_table :posts do |t| t.string name t.boolean draft, comment: '下書き' end end end ``` ```ruby:post.rb // 下書きがどうかを判定するメソッド def draft? draft == 1 end ``` ## マジックナンバーは使用しない まず大前提としてマジックナンバーの使用は避けた方が良い。保守性に影響がでてしまう。 https://qiita.com/daichi0713/items/d838eda12a664bc04542#4%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%8

元記事を表示

RuboCop::Cop::Rails::PresenceというRubocupの指摘

Rubocupでリファクタリングをしていたところ、モデルのメソッドで次の指摘を受けました。

“`ruby:models/sample.rb
C: [Correctable] Rails/Presence:
Use [別テーブルのidを格納した配列を弄る処理].presence || []
instead of [別テーブルのidを格納した配列を弄る処理].blank? ? [] : [別テーブルのidを格納した配列を弄る処理]
変数 = [別テーブルのidを格納した配列を弄る処理] ? [] : [別テーブルのidを格納した配列を弄る処理]
“`

元の記述は配列を処理した結果、空配列であれば空配列を、そうでなければ処理した結果の配列を返すという単純なものですが、同じ記述を2回繰り返す点でDRY原則に沿った書き方ではありませんでした。

今回の指摘で簡潔に書けることがわかりましたが、これまで見かけない記述でしたのでまとめておきます。

## 短絡評価について

https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290

>||の

元記事を表示

自作言語でもRubyの map(&:foo) を真似したい!

# TL; DR

Rubyでブロックの代わりにシンボルを渡せる記法を、[Pangaea](https://github.com/Syuparn/Pangaea)でもできるようにした!

“`ruby:ruby
# どちらも同じ!
names.map {|name| name.upcase}
names.map(&:upcase)
“`

“`pangaea:pangaea
# どちらも同じ!
names.map {|name| name.uc}
names.map(‘uc)
“`

# はじめに

2020年から「Pangaea」というプログラミング言語を自作しています。とにかくコードを短くしたい方におすすめ(?)です。

https://github.com/Syuparn/Pangaea

言語の詳細については過去の記事をご覧ください。

– [ワンライナー向け自作言語「Pangaea」の紹介](https://qiita.com/Syuparn/items/87cafc7fd206016a0f8d)
– [自作言語のオンラインチュートリアルを作ってみた【Pangaea

元記事を表示

画像キャッシュを部分的に無効化する

Imagemagickを深掘りするため、ユーザー画像とアイテム画像を合成させて、簡易的に試着ができるという機能を実装していた。

![9ab908fcf945ef3911f996ea2d4757e7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584427/6c34fefb-aa1f-127b-cdc3-432f7e5790ba.jpeg)

上の画像はパンツの画像とユーザー画像を合成させているが、それぞれのアイテムページから試着ページに遷移するとそのアイテムの画像とユーザーの画像が合成されるという機能で、
例えばジャケットのページで試着ボタンを押すとジャケットの画像とユーザー画像が合成される様になっている。

が、

ローカル環境では問題なく動いていたのに、AWSにアップロードした後試着ページを表示させると一番最初に合成した画像が別の試着ページに遷移しても表示されてしまい、二回目以降は試着できなくなってしまった。

[![Image from Gyazo](https://i.gyazo.com/

元記事を表示

ransackを使った検索機能実装

この記事は勉強した内容をアウトプットし、理解を深めるための学習用記事になっています。
説明の間違えている点などありましたらご指摘いただけると幸いです。
# ransackを使った検索機能実装について

## 実装手順

#### 1. gemに’ransack’を追加してインストール
“`ruby
gem ‘ransack’
“`
“`ruby
$ bundle install
“`
bundle install後にサーバーを立ち上げ直すのを忘れていて30分くらいエラーで引っかかりました、、、
bundle install後にはrails sを忘れずに!

#### 2. コントローラでの記述
このときに私は事前に投稿の一覧を表示させるとずっと勘違いしていました。なので投稿一覧用の変数# @dishes = Dish.allを準備していました。
調べているとransackではデフォルトで一覧画面できるみたいです!
“`ruby
def index
# @dishes = Dish.all
@q = Dish.ransack(params[:q])
@s

元記事を表示

[個人開発]実際に飲食店で使う予約サービスを実務未経験者が1から考え作ってみた。

# はじめに

この度、実際に飲食店で使っている予約サービスをリリースしました!

##### サービスを作ったきっかけ
私が以前手伝いをしていた個人経営の小規模な飲食店では事前の来店数を把握したいが予約受付は営業時間内の電話のみ。予約来店が少ないという課題を実感していました。
その解決策として、お店の要望に沿った予約サービスを開発しました!

実際に使えるような予約システムの参考資料がなく苦労しましたが、初心者なりに1から考え、実装してみました。

# サービス概要
一般ユーザーの予約来店を促し、管理ユーザーの業務効率化を図るサービスです。

https://www.lunchcafeocean.com/

こちらは公開用のクローンサイトです。
実際に使っているものと機能は基本的には同様です。

![Home画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870530/6e19c4d4-a66c-daf3-fe67-5815f14a7b6d.png)

ゲストログインボタンからは管理画面に

元記事を表示

Ruby を書き始めてハマったこと

## `String` なのか `Symbol` なのか

Ruby には `Symbol` という、文字列の皮を被った数値があり、少メモリで高速なことから、`Hash` のキーとかでよく見かけます。

自分で作った `Hash` であれば誤解はないですが、メソッドから生成された `Hash` のキーが `String` だったりすると、キーを指定しても `nil` が返ってきて、「俺が入れたデータが無くなっとる!」と焦ります。

### `JSON.parse` は `symbolize_names: true` をつけると `Symbol`

`JSON.parse` でそのままだと、キーは `String` になる。

“`ruby
JSON.parse(‘{“name”:”tanaka”,”age”:19}’)
=> {“name”=>”tanaka”, “age”=>19}
“`

`symbolize_names: true` をつけるとキーが `Symbol` になります。

“`ruby
SON.parse(‘{“name”:”tanaka”,”age”:19}

元記事を表示

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 %>
===============================

元記事を表示

OTHERカテゴリの最新記事