記事概要
Rubyのメソッドについて、まとめる。
まとめ(ターミナルで実行するメソッド)
putsメソッド
ターミナルに値を出力するメソッド
# 値を出力する
puts 値
irb(main):001> puts 1
1
=> nil
irb(main):002> puts "Taro"
Taro
=> nil
getsメソッド
ターミナルに値の入力機能を起動するメソッド
# 入力機能を起動する
gets
puts '名前を入力してください'
name = gets # 入力が完了するまで、コードの読み込みは停止
puts "名前は#{name}です。" # 入力が完了するまで、この行は読み込まれない。
ターミナルでの実行結果('太郎'と入力)
% ruby ruby_gets.rb
名前を入力してください
太郎
名前は太郎
です。
サンプルコードのruby_gets.rbを参照
まとめ(文字列が持つメソッド)
lengthメソッド
文字列の文字数を数えるメソッド
# 文字列の文字数数える
文字列.length
# 文字列「Hello World」の文字数を数える
irb(main):001:0> "Hello World".length
=> 11
to_iメソッド
文字列を数値に変換するメソッド
# 文字列を数値に変換する
文字列.to_i
# 文字列「30」を数値「30」に変換
irb(main):001:0> "30".to_i
=> 30
# 文字列が数字以外の場合、0に変換
irb(main):002> 'a'.to_i
=> 0
# to_iで文字列を数値に変換し、計算
irb(main):003:0> "100".to_i + 400
=> 500
chompメソッド
文字列の末尾に存在する改行を取り除いた文字列を返すメソッド
# 文字列の末尾に存在する改行を取り除く
文字列.chomp
puts '名前を入力してください'
name = gets.chomp
puts "名前は#{name}です。" # #{name}の後に改行されず、1行で結果が表示される
ターミナルでの実行結果('太郎'と入力)
% ruby ruby_chomp.rb
名前を入力してください
太郎
名前は太郎です。
サンプルコードのruby_chomp.rbを参照
subメソッド
文字列の指定した部分を別の文字列に置き換えるためのメソッド
- 第1引数に置き換えたい文字列を指定
- 第2引数に変換後の文字列を指定
- 操作したい文字列は
/で囲む
irb(main):001> str = "りんごを食べる"
=> "りんごを食べる"
irb(main):002> str.sub(/りんご/,"みかん")
=> "みかんを食べる"
※文字列内に指定した文字が複数含まれている場合、最初にマッチした1つだけが置換される
gsubメソッド
文字列内に指定した文字が複数含まれている場合、その全てを置換するメソッド
gが意味するのはグローバルマッチという言葉
# subメソッドは、最初のハイフンしか置換されない
irb(main):001> tel1 = '090-1234-5678'
=> "090-1234-5678"
irb(main):002> tel1.sub(/-/,'')
=> "0901234-5678"
# gsubメソッドは、すべての文字列を置換する
irb(main):003> tel2 = '090-2345-6789'
=> "090-2345-6789"
irb(main):004> tel2.gsub(/-/,'')
=> "09023456789"
matchメソッド
引数に指定した文字列がメソッドを使用した文字列に含まれているか否かをチェックするためのメソッド
- 指定した文字列が含まれている場合は、戻り値としてオブジェクト「MatchData」が得られる
- 指定した文字列が含まれていない場合は、戻り値としてnilが得られる
irb(main):001> str = "Hello, World"
=> "Hello, World"
# 指定した文字列が含まれている
irb(main):002> str.match(/Hello/)
=> #<MatchData "Hello">
# 指定した文字列が含まれていない
irb(main):003> str.match(/Good/)
=> nil
MatchData
マッチした文字列はまず、MatchDataという種類のオブジェクトで返される。MatchDataから実際にマッチした文字列などを取り出したい場合は、配列から最初のデータを取り出す時と同様の形で取り出せる
irb(main):001> str = "Hello, World"
=> "Hello, World"
# matchメソッドで指定した文字列を取得
irb(main):002> md = str.match(/Hello/)
=> #<MatchData "Hello">
# matchメソッドで取得した文字列を取り出す
irb(main):003> md[0]
=> "Hello"
文字列の指定方法
-
[ ]
[ ]で囲まれた文字のうちいずれか1つにマッチすることを確認 -
-
-(ハイフン)を使用することで範囲を設定することができ、a-zは「アルファベットのaからzまで」という意味
[ ]と組み合わせることで、[a-z]は「アルファベットのaからzまでのいずれか1つにマッチ」という意味# a ~ dのうち、dが含まれているのでマッチ irb(main):001> 'dog'.match(/[a-d]/) => #<MatchData "d"> # a ~ cのどの文字も含まれていないのでマッチしない irb(main):002> 'dog'.match(/[a-c]/) => nilutf-8文字コード表を元に範囲を指定する
指定範囲 意味 備考 a-z 小文字のaからz A-Z 大文字のAからZ ぁ-ん ひらがな全般 「ゔ」「ゕ」「ゖ」を除く ぁ-ゖ ひらがな全般 「ゔ」「ゕ」「ゖ」を含む ァ-ン カタカナ全般 「ヴ」「ヵ」「ヶ」を除く ァ-ヶ カタカナ全般 「ヴ」「ヵ」「ヶ」を含む 一-龥 漢字全般 utf-8文字コード上、「々」は記号として扱われているので、対象外 一-龥々 漢字全般 「々」を含む ー 長音記号 ぁ-ゖァ-ヶ一-龥々ー 日本全般 -
\d
dは数字を表す
数字を表すdのような特殊文字を使用する場合、直前に\を記述するというルールが存在する# 数字が存在するのでマッチ irb(main):001> 'I have 3 pens'.match(/\d/) => #<MatchData "3"> # 数字が存在しないので、マッチしない irb(main):002> 'I have three pens'.match(/\d/) => nil -
{n, m}
直前の文字が少なくともn回、多くてもm回出現するものにマッチすることを確認する
文字数の制約として利用できる# 英文字が4回以上6回以下なので、マッチ irb(main):001> 'abcdefgh'.match(/[a-z]{4,6}/) => #<MatchData "abcdef"> # 英文字が4回以下なので、マッチしない irb(main):002> 'abc'.match(/[a-z]{4,6}/) => nil -
i
最後にiオプションを加えることで大文字・小文字を区別せずに検索する# 大文字・小文字を区別するので、マッチしない irb(main):008> 'Cat'.match(/cat/) => nil # 大文字・小文字を区別しないので、マッチ irb(main):009> 'Cat'.match(/cat/i) => #<MatchData "Cat"> -
.
ハイフンやピリオドなど含めた全ての英数字において、どの1文字にもマッチするirb(main):001> 'hoge'.match(/./) => #<MatchData "h"> irb(main):002> '123'.match(/./) => #<MatchData "1"> irb(main):003> '!@-'.match(/./) => #<MatchData "!"> irb(main):004> 'あ'.match(/./) => #<MatchData "あ"> irb(main):005> 'ア'.match(/./) => #<MatchData "ア"> irb(main):006> '亜'.match(/./) => #<MatchData "亜"> -
+
直前の文字が1回以上の繰り返しにマッチするirb(main):001> 'aaabbc'.match(/a+/) => #<MatchData "aaa"> irb(main):002> 'aaabbc'.match(/b+/) => #<MatchData "bb"> irb(main):003> 'aaabbc'.match(/c+/) => #<MatchData "c"> irb(main):004> 'aaabbc'.match(/d+/) => nil -
{n}
直前の文字がn回出現する場合にマッチするirb(main):001> '12345'.match(/\d{3}/) => #<MatchData "123"> irb(main):002> '12'.match(/\d{3}/) => nil -
\A
\Aの直後に置いた文字を、文字列の先頭に持つ場合にマッチするirb(main):001> '123abc'.match(/\A\d/) => #<MatchData "1"> irb(main):002> 'abc123'.match(/\A\d/) => nil -
\z
\zの直前に置いた文字を、文字列の末尾に持つ場合にマッチするirb(main):001> 'abc123'.match(/\d\z/) => #<MatchData "3"> irb(main):002> '123abc'.match(/\d\z/) => nil -
?=
?=の直後に設定した文字でチェックをかけて、設定した文字が続く文字列が存在する場合、その文字列にマッチする# マイケルの後に指定した文字列が存在するので、マッチ irb(main):001> name1 = "マイケルジョーダン" => "マイケルジョーダン" irb(main):002> name1.match(/マイケル(?=ジョーダン)/) => #<MatchData "マイケル"> # マイケルの後に指定した文字列が存在するので、マッチ irb(main):003> name2 = "マイケルジョーダンJr" => "マイケルジョーダンJr" irb(main):004> name2.match(/マイケル(?=ジョーダン)/) => #<MatchData "マイケル"> # マイケルの後に指定した文字列が存在しないので、マッチしない irb(main):005> name3 = "マイケルジャクソン" => "マイケルジャクソン" irb(main):006> name3.match(/マイケル(?=ジョーダン)/) => nil -
*?
直前の1文字が0回以上続くとマッチするirb(main):001> 'cam'.match(/camp*?/) => #<MatchData "cam"> irb(main):002> 'camp'.match(/camp*?/) => #<MatchData "cam"> irb(main):003> 'campp'.match(/camp*?/) => #<MatchData "cam"> irb(main):004> 'came'.match(/camp*?/) => #<MatchData "cam"> irb(main):005> 'can'.match(/camp*?/) => nil -
\s
空白文字を表し、厳密には、スペースの他にも改行やタブなども含む
ただし、全角スペースは対象外「半角または全角のスペースと一致」を表現したい場合には、
[\s ]と後ろに全角のスペースを記述することで可能 -
\
「正規表現において特別な意味を持つ文字」の直前に入れることで、「正規表現において特別な意味を持つ文字」をただの文字列として扱うことができる文字# エスケープ文字を使用せず「/はスラッシュです」との一致を確認するも、コマンド実行できない irb(main):001> text1 = "/はスラッシュです" => "/はスラッシュです" irb(main):002/ text1.match(//はスラッシュです/) # エスケープ文字を使用して「/はスラッシュです」との一致を確認すると、マッチ irb(main):003> text2 = "/はスラッシュです" => "/はスラッシュです" irb(main):004> text2.match(/\/はスラッシュです/) => #<MatchData "/はスラッシュです"> -
|
|の左右の文字列のいずれか(~または~)irb(main):001> text1 = "Apple" => "Apple" irb(main):002> text1.match("A|B") => #<MatchData "A"> irb(main):003> text2 = "Beer" => "Beer" irb(main):004> text2.match("A|B") => #<MatchData "B"> irb(main):005> text3 = "Cat" => "Cat" irb(main):006> text3.match("A|B") => nil
サンプル
- 大文字小文字は両方可能で、英字もしくは数字8文字以上であること
# 条件を満たしているケース irb(main):001> pass1 = 'Hoge1234' => "Hoge1234" irb(main):002> pass1.match(/[a-z\d]{8,}/i) => #<MatchData "Hoge1234"> # 文字数が不足しているケース irb(main):003> pass2 = 'Hoge123' => "Hoge123" irb(main):004> pass2.match(/[a-z\d]{8,}/i) => nil # 不適切な文字列が含まれているケース irb(main):005> pass3 = 'Hoge123!' => "Hoge123!" irb(main):006> pass3.match(/[a-z\d]{8,}/i) => nil - メールアドレスからドメイン部分のみ抽出すること
irb(main):001> mail = 'hoge@tech-camp.com' => "hoge@tech-camp.com" irb(main):002> mail.match(/@.+/) => #<MatchData "@tech-camp.com"> - 郵便番号を抽出すること
irb(main):003> postal_code = "150-0044" => "150-0044" irb(main):004> postal_code.match(/\A\d{3}[-]\d{4}\z/) => #<MatchData "150-0044"> - 全角かな/カナ漢字の区別を行うこと
# 全角かな/カナ漢字のみなので、マッチ irb(main):001> full_name1 = "山田はな子" => "山田はな子" irb(main):002> full_name1.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/) => #<MatchData "山田はな子"> # 全角かな/カナ漢字のみなので、マッチ irb(main):003> full_name2 = "田中メアリー" => "田中メアリー" irb(main):004> full_name2.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/) => #<MatchData "田中メアリー"> # 全角かな/カナ漢字以外が含まれているので、マッチしない irb(main):005> full_name3 = "yamadaハナ子" => "yamadaハナ子" irb(main):006> full_name3.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/) => nil - 英数字混合を区別すること
irb(main):001> password = "T2o0k2y0o" => "T2o0k2y0o" irb(main):002> password.match(/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i) => #<MatchData "T2o0k2y0o">
パターン 意味 ① . 改行コード以外のどの1文字にもマッチ ① [a-z] 角括弧で囲まれた文字のいずれか 1個にマッチ ② . 改行コード以外のどの1文字にもマッチ ② \d 数字にマッチ ③ \A 直後の文字が先頭にある文字列にマッチ ④ \z 直前の文字が末尾にある文字列にマッチ
squishメソッド
冒頭と末尾のスペースを削除することに加え、連続したスペースを1つのスペースに減らすメソッド
# 冒頭と文字列内にスペースが含まれた文字列
irb(main):001> text = " a i u e o"
=> " a i u e o"
# 上記文字列に対してsquishメソッドを使用することで、冒頭のスペースが削除され、文字列内のスペースも1つのみに減らされる
irb(main):002> text.squish
=> "a i u e o"
splitメソッド
文字列を任意の条件で分割し、配列に格納するメソッド
# 「 」で区切られた文字列
irb(main):001> text = "a i u e o"
=> "a i u e o"
# 上記文字列に対して「 」を区切り文字としたsplitメソッドを使用することで、「,」で区切られた配列が生成される
irb(main):002> text.split(" ")
=> ["a", "i", "u", "e", "o"]
digメソッド
ネストしたハッシュからキーを指定して値を取り出すことのできるメソッド
キーが見つからなかった場合、nilを返す
# マイデータを入れたハッシュを生成
irb(main):001> my_data = {:address => {prefecture: 'Tokyo'}}
=> {:address=>{:prefecture=>"Tokyo"}}
# 対応するキーがある場合は適切に値を取り出せる
irb(main):002> my_data[:address][:prefecture]
=> "Tokyo"
# 対応するキーがない場合はエラーになる
irb(main):003> my_data[:address][:country][:prefecture]
NoMethodError: undefined method `[]' for nil:NilClass (NoMethodError)
# digメソッドを使用すれば対応するキーがない場合、nilが返りエラーにならない
irb(main):004> my_data.dig(:address, :country, :prefecture)
=> nil
まとめ(数値が持つメソッド)
to_sメソッド
数値を文字列に変換するメソッド
# 数値を文字列に変換する
数値.to_s
# 数値「20」を文字列「20」に変換
irb(main):001:0> 20.to_s
=> "20"
# to_sで数値を文字列に変換し、文字列と連結
irb(main):001:0> "i am " + 20.to_s + " years old."
=> i am 20 years old.
まとめ(配列が持つメソッド)
lengthメソッド
配列の要素を数えるメソッド
# 配列の要素数を数える
配列.length
# 配列内の要素数を数える
irb(main):001:0> ['あお', 'きいろ', 'あか'].length
=> 3
empty?
配列の中身が空か、文字列の中身が空の場合にtrueを返す
# itemsテーブルにデータが存在しない
[1] pry(main)> @items = Item.all
Item Load (0.5ms) SELECT `items`.* FROM `items`
=> []
[2] pry(main)> @items.empty?
=> true
[3] pry(main)> @items.nil?
=> false
まとめ(ハッシュが持つメソッド)
mergeメソッド
ハッシュを結合させるメソッド
2つのハッシュを、1つにまとめられる
# ハッシュtweetを作成
irb(main):001> tweet = { text: "桜が咲いてた!", image: "sakura.jpeg" }
=> {:text=>"桜が咲いてた!", :image=>"sakura.jpeg"}
# ハッシュuidを作成
irb(main):002> uid = { user_id: "1" }
=> {:user_id=>"1"}
# 2つのハッシュを結合
irb(main):003> tweet.merge(uid)
=> {:text=>"桜が咲いてた!", :image=>"sakura.jpeg", :user_id=>"1"}
まとめ(繰り返し処理)
timesメソッド
指定した数値の回数だけ繰り返し処理を行えるメソッド
# 数値の回数だけ繰り返す
数値.times do
# 繰り返す処理
end
irb(main):001> i = 0
=> 0
irb(main):002* 3.times do
irb(main):003* puts i += 1
irb(main):004> end
1
2
3
=> 3
eachメソッド
配列やハッシュの要素1つ1つに対して、要素の数だけ繰り返し処理が行えるメソッド
# 配列やハッシュの数だけ、繰り返す
[配列 or ハッシュ].each do | [変数] |
# 繰り返す処理
end
ハッシュを使用
繰り返し処理で、キーと値を表示できる
# ハッシュの生成
irb(main):001> members = {Naruto: 147.5, Sasuke:153, Sakura:150.1}
=> {:Naruto=>147.5, :Sasuke=>153, :Sakura=>150.1}
# 繰り返し処理
irb(main):002* members.each do |key,value|
irb(main):003* puts "#{key}は、#{value}cm"
irb(main):004> end
Narutoは、147.5cm
Sasukeは、153cm
Sakuraは、150.1cm
=> {:Naruto=>147.5, :Sasuke=>153, :Sakura=>150.1}
配列を使用
繰り返し処理で、要素を表示できる
# 配列の生成
irb(main):001> members = ['Naruto', 'Sasuke', 'Sakura']
=> ["Naruto", "Sasuke", "Sakura"]
# 繰り返し処理
irb(main):002* members.each do |name|
irb(main):003* puts name
irb(main):004> end
Naruto
Sasuke
Sakura
=> ["Naruto", "Sasuke", "Sakura"]
each_with_indexメソッド
要素の配列番号を1つずつ取り出し、要素の数だけ繰り返し処理が行える
fruit = ["りんご", "みかん", "いちご"]
fruit.each_with_index do |item, i|
"#{i}番目のフルーツは、#{item}です。"
end
# => 0番目のフルーツは、りんごです。
# => 1番目のフルーツは、みかんです。
# => 2番目のフルーツは、いちごです。
まとめ(クラスが持つメソッド)
newメソッド
定義済のクラスをもとに、インスタンスを新規生成するメソッド
イメージ
# インスタンスを生成する
クラス名.new
# Carクラスを定義
irb(main):001* class Car
irb(main):002> end
=> nil
# Carクラスのインスタンスを生成し、変数pink_carに代入
irb(main):003> pink_car = Car.new
=> #<Car:0x000000010861c8b8>
# 変数pink_carを出力
irb(main):004> pink_car
=> #<Car:0x000000010861c8b8>
createメソッド
インスタンスを新規生成し、引数の情報でデータを保存するメソッド
# インスタンスを新規生成し、引数の情報でデータを保存する
モデル.create(カラム名: 値)
# Postモデルのインスタンスを新規生成
# 引数(content: "今日はお花見")の情報でデータを保存する
irb(main):001> Post.create(content: "今日はお花見")
TRANSACTION (2.5ms) BEGIN
Post Create (21.1ms) INSERT INTO `posts` (`content`, `created_at`, `updated_at`) VALUES ('今日はお花見', '2025-04-19 18:19:01.939093', '2025-04-19 18:19:01.939093')
TRANSACTION (3.8ms) COMMIT
=>
#<Post:0x00000001104a8150
id: 1,
content: "今日はお花見",
created_at: Sat, 19 Apr 2025 18:19:01.939093000 UTC +00:00,
updated_at: Sat, 19 Apr 2025 18:19:01.939093000 UTC +00:00>
updateメソッド
既存データを更新するメソッド
# Postモデル(postsテーブル)に新規データを作成し、変数postに代入
irb(main):001> post = Post.create(content: 'hello!')
TRANSACTION (0.2ms) BEGIN
Post Create (1.1ms) INSERT INTO `posts` (`content`, `created_at`, `updated_at`) VALUES ('hello!', '2025-04-25 19:19:36.718169', '2025-04-25 19:19:36.718169')
TRANSACTION (2.6ms) COMMIT
=>
#<Post:0x000000010d26b3b8
...
# contentカラムの内容を更新する
irb(main):002> post.update(content: 'こんにちは!')
TRANSACTION (0.3ms) BEGIN
Post Update (0.6ms) UPDATE `posts` SET `posts`.`content` = 'こんにちは!', `posts`.`updated_at` = '2025-04-25 19:19:49.803033' WHERE `posts`.`id` = 3
TRANSACTION (1.1ms) COMMIT
=> true
destroyメソッド
テーブルに格納されたレコードを削除するメソッド
# 削除対象を変数に格納
irb(main):001> item = Item.find(1)
Item Load (2.8ms) SELECT `items`.* FROM `items` WHERE `items`.`id` = 1 LIMIT 1
=> #<Item:0x0000000108c00680 id: 1, name: "白ズボン", price: 1000, created_at: Fri, 25 Apr 2025 15:00:50.313053000 UTC +00:00, updated_at: Fri, 25 Apr 2025 15:00:50.313053000 UTC +00:00>
# 変数に格納したレコードを削除
irb(main):002> item.destroy
TRANSACTION (1.4ms) BEGIN
Item Destroy (17.3ms) DELETE FROM `items` WHERE `items`.`id` = 1
TRANSACTION (8.4ms) COMMIT
=> #<Item:0x0000000108c00680 id: 1, name: "白ズボン", price: 1000, created_at: Fri, 25 Apr 2025 15:00:50.313053000 UTC +00:00, updated_at: Fri, 25 Apr 2025 15:00:50.313053000 UTC +00:00>
findメソッド
メソッドの引数にレコードのidを記述すると、idに対応するレコードを取得するメソッド
# モデルに格納されているid=引数のレコードを取得する
モデル名.find(レコードのid)
# Post(postsテーブル)に格納されているid=1のデータを取得
# 変数postに代入
irb(main):001> post = Post.find(1)
Post Load (0.4ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 1 LIMIT 1
=>
#<Post:0x000000010f272080
...
# 変数postに格納されているcontentカラムの情報を出力する
irb(main):002> post.content
=> "今日はお花見"
allメソッド
モデルに格納されている全てのレコードを取得するメソッド
# モデルに格納されている全てのレコードを取得する
モデル名.all
# Post(postsテーブル)に格納されている全レコードを取得
# 変数postsに代入
irb(main):001> posts = Post.all
Post Load (0.3ms) SELECT `posts`.* FROM `posts` /* loading for pp */ LIMIT 11
=>
[#<Post:0x000000010988e230
...
# 変数postsに格納されているレコードを順番に表示
irb(main):002* posts.each do |p|
irb(main):003* puts p.content
irb(main):004> end
Post Load (0.5ms) SELECT `posts`.* FROM `posts`
今日はお花見
入学式🌸
たのしみ〜
=>
[#<Post:0x000000010b9d5790
id: 1,
content: "今日はお花見",
created_at: Fri, 11 Apr 2025 16:24:14.857418000 UTC +00:00,
updated_at: Fri, 11 Apr 2025 16:24:14.857418000 UTC +00:00>,
#<Post:0x000000010b9d5650
id: 2,
content: "入学式🌸",
created_at: Fri, 11 Apr 2025 16:24:21.815603000 UTC +00:00,
updated_at: Fri, 11 Apr 2025 16:24:21.815603000 UTC +00:00>,
#<Post:0x000000010b9d5510
id: 3,
content: "たのしみ〜",
created_at: Fri, 11 Apr 2025 16:24:28.480224000 UTC +00:00,
updated_at: Fri, 11 Apr 2025 16:24:28.480224000 UTC +00:00>]
includesメソッド
引数に指定された関連モデルを1度のアクセスでまとめて取得するメソッド
# includesメソッドを使用するとすべてのレコードを取得するため、allメソッドは省略可能
モデル名.includes(:紐付くモデル名)
@tweets = Tweet.includes(:user)
whereメソッド
引数部分に条件を指定することで、テーブル内の「条件に一致したレコードのインスタンス」を配列の形で取得できるメソッド
モデル.where('検索対象となるカラムを含む条件式')
# idが4未満のtweetsテーブルのインスタンスを配列で取得
[1] pry(main)> Tweet.where('id < 4')
Tweet Load (3.4ms) SELECT `tweets`.* FROM `tweets` WHERE (id < 4)
=> [#<Tweet:0x0000000103fa9d68
id: 1,
text: "桜が咲いてた!",
image: "sakura.jpeg",
created_at: Wed, 30 Apr 2025 16:37:16.661315000 UTC +00:00,
updated_at: Wed, 30 Apr 2025 16:38:37.716922000 UTC +00:00,
user_id: 1>,
#<Tweet:0x0000000105b89f60
id: 2,
text: "春だなあ",
image: "haru.jpeg",
created_at: Wed, 30 Apr 2025 16:37:49.328601000 UTC +00:00,
updated_at: Wed, 30 Apr 2025 16:37:49.328601000 UTC +00:00,
user_id: 2>,
#<Tweet:0x0000000105b89ec0
id: 3,
text: "葉桜になってる",
image: "hazakura.jpeg",
created_at: Wed, 30 Apr 2025 16:38:13.788717000 UTC +00:00,
updated_at: Wed, 30 Apr 2025 16:38:13.788717000 UTC +00:00,
user_id: 1>]
# idが4未満かつuser_idが1のtweetsテーブルのインスタンスを配列で取得
[2] pry(main)> Tweet.where('id < 4').where(user_id: 2)
Tweet Load (0.6ms) SELECT `tweets`.* FROM `tweets` WHERE (id < 4) AND `tweets`.`user_id` = 2
=> [#<Tweet:0x0000000105a642e8
id: 2,
text: "春だなあ",
image: "haru.jpeg",
created_at: Wed, 30 Apr 2025 16:37:49.328601000 UTC +00:00,
updated_at: Wed, 30 Apr 2025 16:37:49.328601000 UTC +00:00,
user_id: 2>]
LIKE句
whereメソッドと一緒に使い、あいまいな文字列の検索をするときに使用する
曖昧文字列
| 文字列 | 意味 |
|---|---|
| % | 任意の文字列(空白文字列含む) |
| _ | 任意の1文字 |
実行サンプル
| 実行例 | 詳細 |
|---|---|
| where('title LIKE(?)', "a%") | aから始まるタイトル |
| where('title LIKE(?)', "%b") | bで終わるタイトル |
| where('title LIKE(?)', "%c%") | cが含まれるタイトル |
| where('title LIKE(?)', "d_") | dで始まる2文字のタイトル |
| where('title LIKE(?)', "_e") | eで終わる2文字のタイトル |
条件に一致したレコード以外を取得
モデル名.where.not("条件")
User.where.not(id: current_user.id)
=> カレントユーザー以外を取得する
first_or_initializeメソッド
whereで検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作るメソッド
# 検索条件に一致するレコードが存在する場合は、レコード情報を返す
irb(main):001> category1 = Category.where(name: 'レディース').first_or_initialize
Category Load (1.9ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`name` = 'レディース' ORDER BY `categories`.`id` ASC LIMIT 1
↳ (pry):1:in `new'
=> #<Category:0x0000000110c2ab58
id: 1,
name: "レディース",
ancestry: nil,
created_at: Tue, 15 Jul 2025 14:54:17.461759000 UTC +00:00,
updated_at: Tue, 15 Jul 2025 14:54:17.461759000 UTC +00:00>
# 検索条件に一致するレコードが存在しない場合は、インスタンスを生成する
irb(main):002> category2 = Category.where(name: 'ウィメンズ').first_or_initialize
Category Load (0.6ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`name` = 'ウィメンズ' ORDER BY `categories`.`id` ASC LIMIT 1
↳ (pry):2:in `new'
=> #<Category:0x0000000110d2fa08 id: nil, name: "ウィメンズ", ancestry: nil, created_at: nil, updated_at: nil>
# saveメソッドでDBにレコードを保存する必要がある
irb(main):003> category2.save
TRANSACTION (2.6ms) BEGIN
↳ (pry):3:in `new'
Category Create (23.1ms) INSERT INTO `categories` (`name`, `ancestry`, `created_at`, `updated_at`) VALUES ('ウィメンズ', NULL, '2025-07-20 06:53:31.593365', '2025-07-20 06:53:31.593365')
↳ (pry):3:in `new'
TRANSACTION (5.7ms) COMMIT
↳ (pry):3:in `new'
=> true
first_or_createメソッド
whereで検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを保存するメソッド
# 検索条件に一致するレコードが存在する場合は、レコード情報を返す
[1] pry(main)> Category.where(name: 'レディース').first_or_create
Category Load (1.1ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`name` = 'レディース' ORDER BY `categories`.`id` ASC LIMIT 1
=> #<Category:0x000000010e3c02f8
id: 1,
name: "レディース",
ancestry: nil,
created_at: Tue, 15 Jul 2025 14:54:17.461759000 UTC +00:00,
updated_at: Tue, 15 Jul 2025 14:54:17.461759000 UTC +00:00>
# 検索条件に一致するレコードが存在しない場合は、インスタンスを生成・DBに保存する
[2] pry(main)> Category.where(name: 'ウィメンズ').first_or_create
Category Load (0.5ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`name` = 'ウィメンズ' ORDER BY `categories`.`id` ASC LIMIT 1
TRANSACTION (0.2ms) BEGIN
Category Create (2.6ms) INSERT INTO `categories` (`name`, `ancestry`, `created_at`, `updated_at`) VALUES ('ウィメンズ', NULL, '2025-08-03 06:27:24.223983', '2025-08-03 06:27:24.223983')
TRANSACTION (3.0ms) COMMIT
=> #<Category:0x000000010f357090
id: 49,
name: "ウィメンズ",
ancestry: nil,
created_at: Sun, 03 Aug 2025 06:27:24.223983000 UTC +00:00,
updated_at: Sun, 03 Aug 2025 06:27:24.223983000 UTC +00:00>
Date
日付を取得するオブジェクト
orderメソッド
テーブルから取得してきた複数のレコード情報を持つインスタンスの、並び順を変更するメソッド
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
インスタンス = モデル名.order("並び替えの基準となるカラム名 並び順")
# tweetsテーブルのレコードを、作成日が新しいものから順に取得する
@tweets = Tweet.order("created_at DESC")
| 並び順 | 内容 |
|---|---|
| ASC(昇順) | 小さいものから大きいものになる。古いものから新しいのものになる |
| DESC(降順) | 大きいものから小さいものになる。新しいものから古いものになる |
find_by_sqlメソッド
SQL文を使用し、データを検索し取得する際に使用するメソッド
# tweetsテーブルからすべてのレコードを取得するSQL文
query = "SELECT * FROM tweets"
# SQL文を使用して、データを取得
@tweets = Tweet.find_by_sql(query)
#=> Tweet.allと同義
attributesメソッド
オブジェクトの属性値をハッシュで取得するメソッド
# 変数postを定義
irb(main):001> post = Post.find(1)
Post Load (0.5ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 1 LIMIT 1
↳ (pry):1:in `index'
=> #<Post:0x000000010c7b39e8
id: 1,
text: "猫",
created_at: Wed, 16 Jul 2025 09:41:33.681683000 UTC +00:00,
updated_at: Wed, 16 Jul 2025 09:41:33.956745000 UTC +00:00>
# postとして情報を取得
irb(main):002> post
=> #<Post:0x000000010c7b39e8
id: 1,
text: "猫",
created_at: Wed, 16 Jul 2025 09:41:33.681683000 UTC +00:00,
updated_at: Wed, 16 Jul 2025 09:41:33.956745000 UTC +00:00>
# attributesメソッドを使用して情報を取得
[irb(main):003> post.attributes
=> {"id"=>1,
"text"=>"猫",
"created_at"=>Wed, 16 Jul 2025 09:41:33.681683000 UTC +00:00,
"updated_at"=>Wed, 16 Jul 2025 09:41:33.956745000 UTC +00:00}
nil?
NULL(何もない)場合にtrueを返す。== nilは同義
[1] pry(main)> item = Item.new
=> #<Item:0x000000010aba50f8
id: 1,
name: nil,
content: "テストです">
[2] pry(main)> item.name.nil?
=> true
[3] pry(main)> item.name == nil
=> true
まとめ(インスタンスが持つメソッド)
initializeメソッド
インスタンスが生成された時に、自動的に実行される処理を定義するメソッド
# インスタンス生成時に自動的に実行される
def initialize
# 処理
end
# Carクラスを定義
irb(main):001* class Car
irb(main):002* def initialize
irb(main):003* puts "Carクラスのインスタンスが生成されました"
irb(main):004* end
irb(main):005* def ride_car(weight)
irb(main):006* @car_weight = weight
irb(main):007* end
irb(main):008> end
=> :ride_car
# Carクラスのインスタンスを生成し、変数pink_carに代入
# initializeメソッドは自動的に処理が実行される
irb(main):009> pink_car = Car.new
Carクラスのインスタンスが生成されました
=> #<Car:0x0000000108fa9a20>
# インスタンスメソッドは、呼び出しが必要
irb(main):010> pink_car.ride_car(900)
=> 900
saveメソッド
レコードを保存するメソッド
# テーブルにレコードを保存する
モデルのインスタンス.save
# モデルのインスタンスを生成し、変数postに代入
irb(main):001> post = Post.new
=> #<Post:0x0000000105d39ce8 id: nil, memo: nil, created_at: nil, updated_at: nil>
# インスタンスにデータを追加
irb(main):002> post.memo = 'こんにちは!'
=> "こんにちは!"
# テーブルにレコードを保存
irb(main):003> post.save
TRANSACTION (3.4ms) BEGIN
Post Create (7.6ms) INSERT INTO `posts` (`memo`, `created_at`, `updated_at`) VALUES ('こんにちは!', '2025-04-08 09:53:47.491589', '2025-04-08 09:53:47.491589')
TRANSACTION (3.2ms) COMMIT
=> true
まとめ(フレームワークが使用するメソッド)
requireメソッド
Sinatraのような仕組み自体を読み込む際に使用するメソッド
# PCにインストールしたSinatraをファイルに読み込む
require 'sinatra'


