Ruby、Railsで使われる主要なメソッド
久しぶりにブログを更新しました。今日はRuby、Railsでよく使われるメソッドについてまとめてみました。いずれもユーザーが定義しなくてもすでに準備されているメソッドです。
Railsでは、Ruby単体では利用ができない特殊なメソッド(present?など)があるので注意してください。
Rubyで使われるメソッド
●newメソッド
インスタンスを生成します。Railsでインスタンスを生成するときに使われます。
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
=> # User:0x225167c @email="mhartl@example.com", @name="Michael Hartl"
●eachメソッド
配列やハッシュの中から、1個づつ値を取り出します。配列の要素数だけブロックを繰り返し、実行します。配列の要素を順番に処理するには、eachメソッドが妥当でしょう。ただし、要素の値を改変したいならば、eachよりもmapの方がいいです。
array = ["apple", "orange", "grape"]
array.each do |item|
print item + ", "
end
=> apple, orange, grape
●sortメソッド
配列やハッシュの中身を昇順に並び替えます。配列の中に数字やアルファベット、ひらがななどがランダムに入っていても、このメソッドで「1,2,3....」「A,B,C...」「あ,い,う...」のように並び替えてくれます。
x = ["う", "い", "あ", "お", "え"]
x.sort
=> ["あ", "い", "う", "え", "お"]
y = ["d", "a", "e", "c", "b"]
y.sort
=>["a", "b", "c", "d", "e"]
z = [3,5,1,25,8]
z.sort
=> [1, 3, 5, 8, 25]
#reverseメソッドで降順も可能
z.sort.reverse
=> [25, 8, 5, 3, 1]
●splitメソッド
指定した区切り文字で、対象の文字列を分割し、配列にして返します。
x = "ruby, php, python"
x.split(',')
=> ["ruby", "php", "python"]
# 引数で区切り文字を指定しなければ、一文字ずつ配列にして返します。
y = "ruby"
y.split('')
=> ["r", "u", "b", "y"]
●unshiftメソッド
配列の先頭に要素を挿入します。
x = ["ruby", "php", "python"]
x.unshift("java")
=> ["java", "ruby", "php", "python"]
●pushメソッド
配列の末尾に要素を追加します。
x = ["ruby", "php", "python"]
x.push("java")
=>["ruby", "php", "python", "java"]
●joinメソッド
配列を結合して、一つの文字列にして返します。
#結合
x = ["ruby", "php", "java"]
x.join
=> "rubyphpjava"
#引数で区切る
x = ["ruby", "php", "java"]
x.join(",")
=> "ruby,php,java"
#平坦化
x = [["ruby","php"],["python","java"]]
x.join(" ")
=> "ruby php python java"
●uniqメソッド
配列内の要素の重複をなくします。
x = ["ruby","php",nil,"java",nil,"ruby","java"]
x.uniq
=> ["ruby", "php", nil, "java"]
Railsで使われるメソッド(Active Recordつまり主にモデルで使うメソッド)
●findメソッド
idカラム(主キー)の値を指定すると、その値を持つレコード(モデルオブジェクト)を1件取り出せます。該当するデータがなければ、例外を出します。
# 主キー(id)が10のユーザーを検索
user = User.find(10)
=> #User id: 10, name: "murata"
# 主キー(id)が123のユーザーはないので、例外ActiveRecord::RecordNotFoundが発生。
# 主キー(id)が1および10のユーザーを検索 。結果は配列として返る。
user = User.find([1, 10])
# => [
User id: 1, name: "abe",
User id: 10, name: "murata"
]
user = User.find(123)
=> #ActiveRecord::RecordNotFound: Couldn't find Member with 'id' =123
●find_byメソッド
カラムを指定して検索、最初に一致したもの、つまり1件だけ返します。また、findと違い該当するデータがない時はnilを返します。
# nameが「Taro」であるユーザーを検索。
user = User.find_by(name: "Taro")
=> User id: 5, name: "Taro", sex: "man", administrator: false
# sex(性別)が「man(男)」でかつadministrator(管理者)であるユーザーを検索。
user = User.find_by(sex: "man", administrator: true)
=> User id: 1, name: "Nakata", sex: "man", administrator: true
# 該当するデータがないときは「nil」が返る。
user = User.find_by(sex: "woman", administrator: true)
=> nil
●whereメソッド
検索条件に一致する複数のレコードを配列として取り出します。
# nameが「Taro」であるユーザーを検索。
user = User.where(name: "Taro")
=> User id: 5, name: "Taro", sex: "man", administrator: false
# idが9以上のレコードが全て取得できる。「?」に第二引数「9」が入る。
user = User.where("id > ?", 9)
=>[
User id: 10, name: "Asano", sex: "man", administrator: false
User id: 11, name: "Naitou", sex: "man", administrator: false
User id: 12, name: "Oguro", sex: "man", administrator: false
.....(省略)
]
# 「name」に文字列「sa」を含むレコードが全て取得できる。
user = User.where("name LIKE?", "%sa%")
=>[
User id: 10, name: "Asano", sex: "man", administrator: false
User id: 15, name: "Sasaki", sex: "man", administrator: false
User id: 19, name: "Sasai", sex: "man", administrator: false
.....(省略)
]
●saveメソッド
レコードの保存に成功すると、trueを返します。失敗すると、falseを返します。
saveを実行して初めてデータベースにレコードがコミットされます。
user.name = 'Dave'
user.save
=> true(失敗すればfalse)
●save!メソッド
レコードの保存に成功すると、trueを返します。失敗すると、ActiveRecord::RecordInvalid例外を起こします。Railsではメソッドに「!」をつけることにより、例外を発生させることができます。
user = User.find_by(name: 'David')
user.name = ''
user.save
=> ActiveRecord::RecordInvalid: Validation failed:
●createメソッド
レコードの作成と保存を行います。作成と保存が成功しても失敗しても、モデルオブジェクトを返します。
User.create(name: "testuser")
=> # User id: 1, name: "testuser", created_at: "2019-11-03 14:22:46", updated_at: "2019-11-03 14:22:46"
●create!メソッド
レコードの作成と保存を行います。作成と保存が成功すればモデルオブジェクトを返し、失敗すれば例外を返します。
User.create(name: "")
=> 例外ActiveRecord::RecordInvalidが発生
●allメソッド
配列の全ての要素を取り出します。データベースのすべてのオブジェクトを返します。
@users = User.all
=>
[
User id: 1, name: "Michael Hartl", email: "mhartl@example.com"
User id: 2, name: "A Nother", email: "another@example.org"
....省略
]