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

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

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

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

Q&A

解決済

3回答

453閲覧

Rails オブジェクトからメソッドを使用できない

taktokyo1

総合スコア25

Ruby on Rails

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

0グッド

0クリップ

投稿2019/06/02 20:15

編集2019/06/02 20:23

クラスから生成されたオブジェクトは、生成元クラスで使用できるメソッドを使用できると理解していたのですが、下記の通り、User.find(1)は正常に動作するものの、user.find(1)とするとNo method Errorになります。

findメソッドはあくまでクラスメソッドであって、Userクラスに定義されていない為、userオブジェクトで使用できないということでしょうか。

該当のソースコード

class User < ApplicationRecord end user = User.new(name:"Michael Hartl", email: "mhartl@example.com") => #<User id: nil, name: "Michael Hartl", email: "mhartl@example.com", created_at: nil, updated_at: nil> >> user.save (0.1ms) SAVEPOINT active_record_1 SQL (2.2ms) INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Michael Hartl"], ["email", "mhartl@example.com"], ["created_at", "2019-06-02 20:03:16.253871"], ["updated_at", "2019-06-02 20:03:16.253871"]] >> user.find(1) Traceback (most recent call last): 1: from (irb):13 NoMethodError (undefined method `find' for #<User:0x0000000003cbda88>) >> User.find(1) User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] => #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2019-06-02 20:03:16", updated_at: "2019-06-02 20:03:16">

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

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

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

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

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

guest

回答3

0

ベストアンサー

> user = User.new(name: 'hoge', email: 'hoge@hoge.com') > user.save

を行った後の user は、
ActiveModel となり、 ActiveRecordの methodが使えなくなる為かと思います。

それに比べ、

> User.find 1 > User Load (0.1ms) SELECT "users".* FROM "users" .... (省略

となるのは、model である User class
ApplicationRecordを継承しており、

ApplicationRecordは、 ActiveRecord::Baseを継承している為
ActiveRecordの、findメソッドを使用できます。

その他にも、
ActiveRecord::Relation というものがあり、
こちらのclassであれば、active_recordのmethodを使用できます。

例えば、

> users = User.all > users.class => User::ActiveRecord_Relation > users.find 1 > User Load (0.1ms) SELECT "users".* FROM "users" .... (省略

といった形で、findを使用できたりします。

的はずれな回答でしたら、すみません。

投稿2019/06/02 21:01

fshun

総合スコア261

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

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

taktokyo1

2019/06/03 10:33

非常にご丁寧な回答有難う御座いました!大変理解が深まりました!
fshun

2019/06/03 12:02

良かったです????!!
guest

0

findは、データベースから検索するために使うメソッドです。
http://railsdoc.com/references/find

Ruby

1モデル.find(引数)

User.find(1)は、テーブルからid=1のデータを取得しているので値を取得することができますが、
user.find(1)は、モデルではないので、メソッドエラーがでているのではないでしょうか?

投稿2019/06/02 23:12

編集2019/06/02 23:22
no1knows

総合スコア3365

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

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

taktokyo1

2019/06/03 10:33

参考サイトまで有難う御座います!大変助かりました!
guest

0

user.find(1) でうまく動かないのは、 User class に find がインスタンスメソッドとして定義されていないからですね!

ApplicationRecord にはクラスメソッドとして find メソッドが使える状態にあるので、それを継承している User classは find メソッドが使えるようになります!

投稿2019/06/02 23:03

t_kusakabe74

総合スコア549

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

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

taktokyo1

2019/06/03 10:32

明瞭なご回答有難う御座いました!大変助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問