質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

758閲覧

Progate Ruby on Rails Ⅸ クラス内でインスタンスメソッドを定義することについての疑問点

miitaka

総合スコア2

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/27 03:40

前提・実現したいこと

現在ProgateのRuby on RailsⅨを勉強中です。
Postモデルにuserメソッドを定義し、投稿に紐づいたuserインスタンスを戻り値として返すuserメソッドの理解に苦戦しているため質問させてください。

該当のソースコード

データベース

Posts
|id|content|created_at|update_at|user_id
|:--|:--:|--:|
||||

Users
|id|name|email|created_at|update_at|image_name|password
|:--|:--:|--:|
||||


**Postモデルで、投稿とユーザーを紐づけるためのインスタンスメソッドを定義
**

/models/post.rb

class Post < ApplicationRecord #インスタンスメソッドuserを定義してください def user return User.find_by(id: self.user_id) end end
$ rails console > post = Post.find_by(id: 1) > post.user => id: 1 name: hoge . . .

わからないこと

  • 「インスタンスメソッド内で、selfはそのインスタンス自身を表す」との説明があったが、それはどういう意味なのか
  • 何故、Postモデルで定義するのか
  • Postクラスのインスタンス変数はどこに書いてあるのか

私なりの解釈として、上記のコードには記載がありませんでしたが、

class Post < ApplicationRecord #attr_accessor :content #attr_accessor :user_id #インスタンスメソッドuserを定義してください def user return User.find_by(id: self.user_id) end end

Postクラスには、上記のコードで#コメントに記載したように content と user_id のインスタンス変数があり、selfの意味は Postクラス内にあるインスタンス変数 user_id のことを指しているのかと予想しています。しかし、「インスタンスメソッド内で、selfはそのインスタンス自身を表す」という意味を理解することができません・・・。
あと、Postクラスのインスタンス変数は、データベースの各項目のことなのかな、と考えているのですが、その理解で合っていますでしょうか。

また、Postクラスの中でUserを使ってインスタンスメソッドを定義していますが、これはデータベースのUserモデルの中身をfind_byメソッドで探しているという解釈でよろしいでしょうか。なんだかPostクラスの中でUserを使用しているのが初めての書き方で違和感があります・・・。

Rubyではクラスとインスタンスメソッドについて理解はしていたつもりでしたが、Railsになると、さっぱりわからなくなってしまいました。
わかりづらい質問ですみませんが、以上について、お答えいただけると幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「インスタンスメソッド内で、selfはそのインスタンス自身を表す」という意味を理解することができません・・・。

「そのインスタンス」は、foo.bar(:param)のようにメソッドを呼び出した場合のfooです。

Postクラスの中でUserを使ってインスタンスメソッドを定義していますが、これはデータベースのUserモデルの中身をfind_byメソッドで探しているという解釈でよろしいでしょうか。

はい。


そもそも論ですが、Postクラスでbelongs_to :userを宣言すれば、userメソッド以上のものがほぼ自動的に得られます。自分で書く必要性そのものがありません

投稿2020/07/27 03:59

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/27 04:06

> Rubyではクラスとインスタンスメソッドについて理解はしていたつもりでしたが、Railsになると、さっぱりわからなくなってしまいました。 (Rails特有のメソッドを使って定義するのでなければ)何も変わりません。
maisumakun

2020/07/27 04:09

> Postクラスのインスタンス変数はどこに書いてあるのか これはRailsがテーブルを見て自動的に作成しています。ただし、「@user_id」のような名前の変数にデータを保管しているわけではないので、user_idのアクセサメソッドを使う必要があります。
miitaka

2020/07/27 15:16

回答ありがとうございます belongs_to :user については知らなかったので勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問