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

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

tsunagi-functionsでSymbolブロックチェーンのトランザクションを自由自在に作ろう!(Ruby編)

この記事は、以下に紹介したtsunagi-functionsのRuby実装版です。

https://qiita.com/nem_takanobu/items/4b5d67fe9eb80ae35433

トランザクション構築の内部処理やノードへの通知方法については以下の記事もご参考ください。

https://qiita.com/nem_takanobu/items/2cff7bd2722aa86fec84

Symbolブロックチェーンをよく知らないという方はこちらで速習することができます。

https://github.com/xembook/quick_learning_symbol

# リポジトリ

##### tsunagi-functions for Ruby
https://github.com/xembook/tsunagi-sdk/tree/main/ruby

関数群の提供のため、sdkという名称は今後functionsに変更予定です。

# テスト

テストスクリプトを以下に置いています。実行することができればそのロジックをそのまま実装に利用することができます

元記事を表示

【Rails】【Ruby】find_by_sql でも preload したいとき

# はじめに
`find_by_sql` を使って複雑なSQL文を書いたが、N+1を避けるために `preload`したい時がある。

# 結論
下記のように書けばOK
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new.preload(records, :like)
“`

下記は`preload`が無視されるのでダメ
“`ruby
User.preload(:like).find_by_sql(…)
“`

# 注意点
**Rails7 で記法が下記のように変わる**
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new(records: records, associations: :like).call
“`

# 参考
https://www.natsuneko.blog/entry/2017/04/18/find_by_sql-preload

元記事を表示

[Rails] 複数の小モデルを跨いだor検索

バージョンの問題で5.1.以下の複数の小モデルを使ったor検索の実装方法があまり載っていなく少しでも役に立つかもと思ったので投稿します。
もっと良い書き方があれば教えていただきたいです。

## 学んだこと
・includeを使うと小モデルのオブジェクトを親クラス内から使えるということを学びました。
“`
Child.include(:parent).is_summer_vacation
“`
・idを使ってor検索を実装すること(rails5.2からは.[or()](https://qiita.com/YumaInaura/items/c4ea8271f5793962a26d)を使っていけるかも)
## 環境
Rails 5.1.6.2
Ruby 2.5.0

### DB
“`book.rb
has_one: business #ビジネス書
has_one: novel #小説
has_one: comic #漫画
“`

### 複数の小モデルを跨いだor検索
本の検索サービスにおいてアメトークで紹介された本を絞り出すという状況を想定して実装コードを紹介します。
“`

元記事を表示

Rails 7 + ImportmapでFont Awesomeを実装する

# FontAwesome
アイコンを使うのに[FontAwesome](https://fontawesome.com/)というライブラリーはすごくいいだけど、インストールするには公式サイトにこれしか書いてなかったからインストールに詰まりました。
“`shell
# npm
npm install –save @fortawesome/fontawesome-free

# yarn
yarn add @fortawesome/fontawesome-free
“`

これだけだとアイコンは表示されないし、フレームワークごとのインストール方法は書いてなかったからちょっと調べてみたら、YouTubeの[この動画](https://www.youtube.com/watch?v=c-EbQDB0RsQ)を見つけてFontAwesomeをけっこう簡単に実装できたのでやり方をこちらにも書いときます。

そもそもImportmapの使い方は知らなかったのが詰まる原因だったと思うんで反省していますが、とにかく実装できたのですっきりしました。

# パッケージマネジャーでインストールした後に

元記事を表示

Ruby3.1を触ってみる(IRB のオートコンプリートとドキュメント表示)

# 0. はじめに
[前回](https://qiita.com/Satoooon/items/2412e9ba6de1f3afefb1) に引き続きRuby 3.1の新機能について動かしながら紹介しようと思います。

今回は IRB のオートコンプリートとドキュメント表示 になります。
irb自体はRubyを触っていれば簡単な動作確認したりと誰しもが使ったことがあるものだと思います。
それの拡張された機能になります。早速みていきましょう!

# 1. リリースノートを見てみる
> IRB にオートコンプリート機能が実装され、コードを入力するだけで補完候補ダイアログが表示されるようになりました。Tab と Shift+Tab で上下に移動できます。
また、補完候補を選択している時に、ドキュメントがインストールされている場合、補完候補ダイアログの横にドキュメントダイアログが表示され、内容が一部表示されます。Alt+d を押すことでドキュメント全文を読むことができます。

引用: https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0

元記事を表示

【Rails】countメソッドにカラムを指定してエラーを回避

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況

relationでjoinしている“`posts“`に“`count“`したら下記のエラーが発生し“`count“`できない。
“`ruby
posts = Post.joins(:users)
=>Post::ActiveRecord_Relation

posts.count
=>ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near “AS”
“`

## 解決法

ActiveRecordのcountメソッドは引数にカラムを指定できるのでそれを使うとcountできる。

“`ruby
posts = Post.joins(:users)
posts.count(:posts)
=> 4
“`

## 参考

https://railsdoc.com/page/count

元記事を表示

using Module.new ってなに?

## はじめに

調べ物をしている際に、`using Module.new {}`というコードを見たのでどういう処理をするんだろうと思い調べてみた備忘録です。

## 無名モジュールとは何?
無名モジュールは、その名の通り名前のついていないモジュールのことです。`Module.new`で作成したモジュールは無名モジュールとなるらしいです。
もちろん無名なので、includeなどで指定することが出来ませんので他のファイルから呼び出すこともできません、多分…。

“`ruby
mod = Module.new {
def self.anonymous
puts “anonymous module”
end
}

mod.name
# => nil

mod.anonymous
# => anonymous module
“`

わざわざ無名で作成してるので、名前をつけたくなることがあるかは分かりませんが…
変数を参照することで名前を与えることができます。

“`ruby
mod = Module.new {
def self.named
pu

元記事を表示

Rails7でflash.nowを表示させる

### 解決したい事

私が出した質問なのですが、まずはご覧になってください。

https://qiita.com/woodman0224/questions/0eb98675a161c2dce0a5

記事の通りではありますがrenderはされてもflash.nowが表示されなくて困っていました。

### 解決策
たくさんの記事をよく読んでいると、もしかしてと思う事があったので試してみたらできました。

それはフォームでTurbo Drive を無効にするという方法です。
“` ruby
#sessions/new.html.erb

#改善前
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>

#改善後
<%= form_with(url: login_path, scope: :session, local: true, data: { turbo: false }) do |f| %>

“`

やはり予想が正しくrailsのバージョン

元記事を表示

macOS Monterey (x86_64-darwin-21) で libv8 の install を行う方法

## はじめに

macOS Monterey (x86_64-darwin-21) 環境下で [mini_racer] が依存する [libv8] gem を install する必要があり対処方法をまとめました

## TL;DR

– macOS Monterey (`x86_64-darwin-21`) 環境下では “libv8” gem の install は出来ない
– 前 macOS Big Sur (`x86_64-darwin-20`) 用のファイルを取得し patch をあてセットアップを行うと簡単

## なぜ macOS Monterey で簡単に install できないのか

[All versions of libv8] を確認してみると `x86_64-darwin-21` 用の binary が提供されていません。
binary が提供されていない = source から build する必要があります

[libv8] の README に記載されている Platform は以下のみとなり `x86_64-darwin-21` 環境下だと簡単に in

元記事を表示

Rails7.0.4 Ruby3.1 Mysql8.0 docker-compose で環境構築する。ついでにTailwindCSS と DaisyUI も入れちゃう。

# はじめに
勉強用にちいさなアプリを作成することがありますが、環境構築がめんどくさくて止めちゃうことありますよね?
環境構築で詰まらないように記録しておきます。

Rails の環境構築の記事はたくさんありますが、できるだけ最新のバージョンでやってみました。
Rails 7.0.4
Ruby 3.1
Mysql 8.0
# 参考

https://docs.docker.com/samples/rails/

https://qiita.com/croquette0212/items/7b99d9339fd773ddf20b

# プロジェクトの作成

“`sh
mkdir test-app
cd test-app
“`

# 設定ファイルの作成

“`Dockerfile:Dockerfile
FROM ruby:3.1

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /mya

元記事を表示

[Ruby]Dateクラスについて

# Dateクラスとは?
Rubyの標準ライブラリの機能

# 使い方は?
以下一文を記載します
“`ruby
require “date”
“`

# 例えば・・・
今日の日付を取得したい時は
“`ruby
Date.today
“`
で取得できます。

今日の曜日を取得したい時は
“`ruby
Date.today.wday
“`
と記述しますが、**wday**は曜日を0(日曜日)から6(土曜日)の整数で取得するので、
配列を定義して日曜日(0番)〜土曜日(6番目)まで文字列を格納する必要があります。
その**wday**で取得した値を配列より取り出し、曜日を取得します。

“`ruby
require “date”
day = Date.today.wday
days = [“日曜日”, “月曜日”, “火曜日”, “水曜日”, “木曜日”, “金曜日”, “土曜日”]
puts days[day]
“`
例:dayの値が5の場合
daysの5番目の値である金曜日が出力されます。
※配列は0から数えます

元記事を表示

比較演算子を使った条件分岐

今日もアウトプットの練習。

# 問題
ターミナルから数字を入力して、数字に応じて以下のように出力するプログラムを書いてください。

10以下なら10以下の数字です
10より大きい数値なら10より大きい数字です
10以下でかつ0以下なら0以下の数字です
ソースコードは以下の雛形を使ってください。
“`
1
2
3
input = gets.to_i

# ここからソースコードを書いてください
“`

#### 数値の比較なので比較演算子を使う

|演算子|例文|意味|
|:-: |:-:|:-:|
|== |a == b|aとbが等しい|
|!= |a != b|aとbが等しくない|
|> |a > b |aはbより大きい|
|< |a < b |aはbより小さい| |>= |a >= b |aはb以上|
|<= |a <= b |aはb以下| #### 自分の解答 ```practise.rb input = gets.to_i if input <= 10 && input <= 0 puts "0以下の数字です" elsif inp

元記事を表示

RubyKaigi 2022 参加レポート

# はじめに
RubyKaigi2022にオンラインで参加してきました。
私自身のRubyを業務で使った経験は1年半ちょっとです。
そのうち半年は一人で開発をしていたのでほとんど独学で、今の職場で色んなRubistに出会って改めて学び直してる途中です。
なのでRubyとはまだそこまで仲良くない上に、初めて参加したRubyKaigiでしたが多くの学びが得られた良い体験でした。

# 発表

全体スケジュールは以下です。
https://rubykaigi.org/2022/schedule/#day1

## [Ruby meets WebAssembly](https://rubykaigi.org/2022/presentations/kateinoigakukun.html#day1)

https://speakerdeck.com/kateinoigakukun/ruby-meets-webassembly

簡単に言えば、JavaScriptのようにRubyをブラウザ上で実行が出来る仕組みです。
恥ずかしながらWebAssemblyも盛り上がってることは知っていたのですが、こ

元記事を表示

Rubyは死んでないし、終わってないし、稼げる言語(RubyKaigi2022に参加しました)

# はじめに

エンジニアです。Rubyでの開発は3年です。
Qiita初投稿+RubyKaigi初参加なので、色々慣れていないです。
この記事は優しい気持ちで眺めていただけると?

# この記事は何か

RubyKaigi2022 で三重に行って松坂牛を食べてきた話です。
Rubyの諸々の話も聞いてきました。

# このイベントで理解した(であろう)こと

コンテンツ盛りだくさんすぎて、~~(全然、頭に入らなかった)~~
メモするためのPCのバッテリーが枯渇して全然メモ取れなかった ~~(言い訳)~~
ので理解度は低めなのですが、

– 松坂牛は美味しい。
– 赤福は美味しい。
– RubyはWebAssemblyに対応してブラウザで動くようになったらしい
– Rubyはマルチスレッドの処理を M:Nモデルで扱えるようになるらしい
– RubyはRust製のコンパイラによって早く+メモリ効率良くなるらしい
– 古いバージョンのRubyは最新のmacOSでビルドできない
– Rubyのパパはネット上のRuby批判を憂いている

***!!!! Rubyは死んでないし、終わってないし、稼

元記事を表示

偶数の数をカウントして出力するメソッド

今日も学んだ事を忘れない為にメモします。

### プログラム内容
配列にある値の中から偶数の数をカウントして出力する。
対象の数値が偶数かどうかを判断するeven?メソッドを使用する。

### 記述内容
“`
def count_evens(nums)
count = 0
nums.each do |num|
if num.even?
count += 1
end
end
puts count
end

count_evens([5,6,8,12,14,19])
count_evens([1,3,7,10,13])
“`
“`:出力結果
4
1
“`

列の中の偶数の数を出力するためにカウントした数を保持するための変数が必要なので、変数countを用意する。
ここで注意するのは変数countを書く場所。
配列から値を取り出す為のeach分の中にcount = 0を書くとループ処理で毎回数字が0に上書きされてしまうのでeach分の外に書く。

配列に入っている数字をeach文で取り出し、even?メソッドで一つずつ偶数か

元記事を表示

Ruby 会議2022レポート(1日目と2日目)

こんにちは!ruby2年目エンジニアのHiraです!
今回は、Ruby会議2022に参加してきたので紹介したいと思います!

イベントのタイムスケジュールとセッション

https://rubykaigi.org/2022/schedule/#day1

去年と同様であれば、youtube上でも今後配信されるのでこちらも是非!
https://www.youtube.com/channel/UCBSg5zH-VFJ42BGQFk4VH2A/playlists?app=desktop

せっかくなので、画像もぺたり
![9614BDF9-C7E8-41E2-BA1E-28DD256A7C78.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539384/2dbd5bb8-a4b5-3f62-b2fc-0c20f2a5ff0f.jpeg)

# セッション
すべてを見ることはできなかったので、個人的に気になったトピック

## 一日目
### Ruby meets WebAssembly
スライド

h

元記事を表示

アルゴリズムでよく使う手法(Ruby)

# アルゴリズムでよく使う手法まとめ
paizaでアルゴリズムの練習問題でよく使い、よくつまずくポイントを残します。

## 向きについて
マスを進んでいく問題で向きを変えながら一マスずつ進む問題での向き判定

“`rb
# 左から上、右、下、左
move = [[-1, 0], [0, 1], [1, 0], [0, -1]]

# 向き
now = 0

# 初期位置
y, x = [3, 3]

# 向きによってy, xを変える
# 向きの値を4で割り、その値によってmoveに入っている変化する値を取得できる。
ny = y + move[now % 4][0]
nx = x + move[now % 4][1]

# 方向変換がある場合、値を1増減することで4で割って出るあまりの値を変える。
if d == ‘L’
now -= 1
else
now += 1
end

# 枠が指定されている場合はみ出さないように判定する
h = 10
w = 10
0 <= ny && ny <= h - 1 && 0 <= nx && nx <= w - 1 ``` ## 累積

元記事を表示

has_manyのsourceオプションはいつ使うのか

has_manyメソッドのsourceオプションは次の場合に使用します。

1. 多対多のアソシエーションに別名をつける
2. has_manyで指定するモデル名が重複している

例として、ユーザーが投稿を作成・いいねできる関連付けを行います。
![qiita-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881292/053db736-90b1-83ee-8377-7dc51705ef82.png)

#### いいねした投稿を取得する
“`ruby
#models/user.rb
class User < ApplicationRecord has_many :posts has_many :likes end #models/like.rb class Like < ApplicationRecord belongs_to :user belongs_to :post end #models/post.rb class Post < ApplicationRec

元記事を表示

RSpec使い方まとめ

## Let メソッド
各example共通の変数を作れるらしい
“` let(:変数名){変数の値} “`という感じで書く
なおletで作った変数は、各exampleの内部で値を変えても
別のexampleの内部には影響しない

“`ruby
RSpec.describe Card do
let(:card){
Card.new(“Ace”,”Spades”)
}
# letメソッドを使って各example共有の変数cardを作る
# letブロックの内部は必要なときにのみ計算される
it “has a rank and we can change it” do
expect(card.rank).to eq(“Ace”)
card.rank = “King”
expect(card.rank).to eq(“King”)
end
# 上記exampleでcard.rankを書き換えているが
# 他exampleの内部には影響はない
it “has a suit” do
expect(card.suit).to eq(

元記事を表示

[Ruby]二重ハッシュからの特定の値の取得方法

プログラミング初心者です。
自身の備忘録として、記事を投稿していきたいと思います。

## 二重ハッシュからの特定の値の取得方法について

まずハッシュから特定の値を取得するには

“`ruby
ハッシュ[取得したい値のキー]
“`

で取得できます。

次にハッシュが二重になっている場合は

“`ruby
ハッシュ[取得したい値のキー][取得したい値のキー]
“`

で取得できます。

よって 以下のハッシュから「John」を取り出すには
“`ruby
user_data = {user: {name: ‘John’}}
puts user_data[:user][:name]
“`

となります。

元記事を表示

OTHERカテゴリの最新記事