初学者向けself.の使い方について
Ruby on Railsを学習して1ヶ月経ったので
1ヶ月前の自分が分からなかった事の一つselfについて
初学者なりにイメージしやすい使い方を伝えようと思います。
出来るだけ専門用語を使わずに書きますが
抜け漏れ誤りがあればご指摘してもらると助かります。
self.とは
chatgptに専門用語を使わずにselfとは何か質問したら下記の返答がありました。
「selfは、RubyやRailsで使われる言葉で、
特定のコードの中で 「自分自身」 を指すキーワードです。
例えば、あるオブジェクトが自分自身のメソッドを呼び出す場合や、
クラス内で自分自身にアクセスする場合に使います。簡単に言えば、
そのコードの中で「私(自分自身)」を指すものと考えれば良いです。」
はい、どうでしょうか?イメージ出来ますか?
selfを学び始めの頃の自分には 「自分自身」 ってどういう事?ってなってました。
なのでこれから 「自分自身」についてイメージしやすくしていきます。
※以下の図を理解するにはRailsの基礎MVCについて
なんとなくでもいいので理解する必要があります。
短時間で作ったので見にくい箇所もあるかもしれませんが
Railsは上記の図の①から順に処理をしています。
selfを使うのはMVCのM、モデルファイルにて使用します。
ではモデルとは何をするファイルでしょうか?
モデルファイルはデータベース内のテーブルにアクセスし、
データの取得や保存を行うためのコードが記述するファイルです。
先ほどの図の④、⑤を見るとイメージしやすいと思います。
そしてモデルファイルはデータベースの一つのテーブルに対して一つのみ存在します。
実際にデータベースを作成した事がある方は分かると思いますが、
ターミナルでbin/rails generate model (モデル名)
を実行すると
マイグレーションファイル(データベースの変更やテーブルの作成に関するコードが含まれるファイル。例: db/migrate/(タイムスタンプ)create(モデル名.pluralize).rb)と
モデルファイル(データベーステーブルの構造やデータの操作に関するコードが含む。
例: app/models/(モデル名).rb)が作成されます。
今回は以下のようにマイグレーションファイルに記述してマイグレーションするとします。
(マイグレーションとは、データベースの構造を変更するための手順を定義したファイルのことです。これによって、新しいテーブルを作成したり、既存のテーブルに新しいカラムを追加したりすることができます。マイグレーションファイルには、その変更内容が記述されています。)
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name
t.integer :age
t.timestamps
end
end
end
上記のコードでUsersテーブルを作成し、
カラムには名前が入る「name」年齢が入る「age」を入れています。
説明が長くなりましたがこれから実際にselfを使わない場合と使う場合を見ていきましょう。
モデルファイル(app/models/user.rb)
selfを使わない場合
class User < ApplicationRecord
def User.create_new_user(name, age)
user = User.new(name: name, age: age)
user.save
user
end
end
selfを使う場合
class User < ApplicationRecord
def self.create_new_user(name, age)
user = self.new(name: name, age: age)
user.save
user
end
end
実用的なコードではありませんが、
使う場合と使わない場合どちらも同じ処理です。
selfを使う場合と使わない場合を比較すると
User.と記述するかself.を記述するかの違いが分かります。
先程も書いた内容ですが、
「モデルファイルはデータベースの一つのテーブルに対して一つのみ存在します。」
つまりモデルファイル「user.rb」とUsersテーブルは繋がっていて、
Usersテーブルからデータの取得や保存を行うためのコードは
「user.rb」にしか 記述が出来ません。
上記の事から
Usersテーブルを利用したコードをuser.rb内に記述するのに
わざわざUser.と記述するのではなく、
self.(自分自身)と記述すれば
プログラムが「User.の事か」と解釈してくれます。
最後に
今回はself(自分自身)についてイメージしやすくする為に
出来るだけ専門用語を少なくして説明しました。
基本的な内容なので、例外もある内容だと思いますが
抜け漏れ誤りがある場合はご指摘頂けると助かります。
自分もまだ初学者の部類ですが、Rails勉強始めて間もない方の参考になれば嬉しいです。
ちなみにRails学習していくとselfは省略出来る事を学ぶので
学習後半には使わない場面があると思います。
例えば先ほどのコードだと
class User < ApplicationRecord
def self.create_new_user(name, age)
user = new(name: name, age: age)
user.save
user
end
end
上記のようにself.newではなくnewだけで大丈夫です。