ずみーBlog

元クラゲ研究者(見習い)の92年生まれがエンジニアを目指しながら日々寄り道するブログです。

【オブジェクト指向】インスタンス変数の使い方がちょっとだけわかった話

結論

配列のクラス変数を用意してnewする時にインスタンスを必ず配列に追加するようにしておけば、後から集計に使えるってことに気付きました。

今回の例

Foodクラスに@@foods = []という配列型のクラス変数を持っておき、12行目のinputメソッドでインスタンス生成するたびに@@foodsインスタンスを追加しておきます。

すると、クラスメソッドのshow_all_calory(20行目)でいとも簡単に今まで生成したインスタンスを繰り返し処理したり、カロリー合計が計算できてしまいます。

続きを読む

Active Hashで固定値をDB保存せずにテーブルのようにして扱う

ブログ投稿サービスで、記事投稿時にジャンル選択ができるような機能を実装しながら、Active Hashについて学びました。

Active Hashのきほん

都道府県や記事カテゴリなど、追加・変更が頻繁に生じないようなデータは、DBにテーブルを作るのではなく、Active HashでRails側に保持すると便利です。

続きを読む

配列の中で重複していないものだけを合計する

やりたいこと

Rubyで、配列で渡される数値の合計値を出力するメソッドが作りたい。 ただし、渡された配列内で値が重複している数字は除いて合計を計算する。

出力例

lone_sum([1, 2, 3]) # → 6
lone_sum([3, 2, 3]) # → 2
lone_sum([3, 3, 3]) # → 0
続きを読む

FactoryBotとFaker

みなさま、おはようございます。ずみーです。

RSpecでテストデータの自動作成を行ってくれる、FactoryBot)とFakerの導入と使い方についての備忘録です。

ちなみに、Wikiにはこうありました。

Factory Bot(元々はFactory Girlとして知られていました)は、Rubyプログラミング言語用のソフトウェアライブラリで(以下略)

Factory Girlって日本で言うリケジョみたいなイメージだったんでしょうか。

続きを読む

RSpecの基本的なマッチャまとめ

マッチャとは

こちらの記事によれば、

 期待値と実際の値を比較して、一致した(もしくは一致しなかった)という結果を返すオブジェクト

だそうです。   RSpecのテストコードで使います。

例えばこんな場合

  • あるページに飛んで、飛んだ先にあるはずの文言やリンクがきちんと表示されているかを確認したい
  • ログインしているユーザとは別のユーザによる投稿の表示されないはずの編集ボタンが表示されていないことを確認したい

「〜なはず」を表すのがすなわちマッチャです。
期待することの種類によって様々なマッチャを使い分けます。

具体例

テストデータが有効かどうか

  • be_valide
expect(@user).to be_valid

リンクのあるなしを判定

#リンクがあるとき
expect("要素").to have_link 'ボタンの文字列', href: "リンク先のパス"

#リンクがないとき
expect("要素").to have_no_link 'ボタンの文字列', href: "リンク先のパス"

ページに文字列が含まれるかどうか

  • have_content
  • have_no_content
expect(page).to have_content('更新が完了しました。')

特定の画像があるかどうか

  • have_selector
  • have_no_selector
expect(page).to have_selector ".content_post[style='background-image: url(画像URL);']"

データが1件増えたか(減ったか)どうか

expect{
  all(".more")[1].hover.find_link('削除', href: tweet_path(@tweet1)).click
}.to change { Tweet.count }.by(-1)

今までに学習したのはこんなところです。

また新しいのを覚えたら追記します。それでは。

Railsのアソシエーション 〜お前、なぜそれを知っている?!〜

どうも、ずみーです。
突然ですがみなさん、Railsの勉強をしていて、不思議に思うことはありませんか。

お前、なぜそれを知っている?!と。

実はこのRails、こっちが指示していないことも裏でたくさんやっといてくれる、
小粋な心遣いがいっぱいなのでした。

ことの発端

ある日、手順書を見ながらチュートリアルアプリの実装を進めていました。
テーブルは2つです↓

users

id email
1 hogehoge@qmail.com
2 norinori@uahoo.co.jp

tweets

id text user_id
1 ノリノリだぜ 2
2 おりゃあああ 1
3 グフっ 1
4 なんだって? 2

1人のユーザに対して、複数のツイートが存在するという状況です。
(ツイートの例がアホみたいですが気にしないで^^)

モデルにアソシエーションを設定

userモデル

class User < ApplicationRecord
  〜省略〜
  has_many :tweets
end

tweetモデル

class Tweet < ApplicationRecord
  〜省略〜
  belongs_to :user
end

has_manyメソッドとbelongs_toメソッドでアソシエーション(関係)を記述していきます。
ユーザ:ツイートが1:多なので、 英語で書いてみるとわかりやすい。

User has many tweets.
Tweet belongs_to user.

...って、あれ?

has_many :tweets

モデル名が複数形になってる!

もう一つの疑問

user_idがユーザのことだってなぜわかるのだろう?
確かにtweetはuser_idをキーとしてuserと紐づいています。

users

id email
1 hogehoge@qmail.com
2 norinori@uahoo.co.jp

tweets

id text user_id
1 ノリノリだぜ 2
2 おりゃあああ 1
3 グフっ 1
4 なんだって? 2

調べてみた

今回の疑問は二つ。

  1. モデル名はtweetなのに、なんでhas_manyで複数形のtweetsが使えるのだろう?
  2. tweetの中でユーザを示すカラムがuser_idだとなぜわかるのだろう?

超絶詳しい記事がありました(放棄)

記事によると、モデル名(必ず単数形)やカラム名を、規約通りに書くことで、Railsがよしなに判断してくれるというものでした。
まさにCoC(Convention over Configuration)(設定より規約)なのですね。
それでは、また。