🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

2558閲覧

ActiveRecordでモデル間の関連付けを行いたいです。

tabut

総合スコア4

Ruby

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

1グッド

0クリップ

投稿2019/12/12 06:50

###railsチュートリアル2章のモデル間の関連付けについての質問です。
UserモデルとMicropostモデルの関連付けを行いました。

関係性
親 Userモデル
子 Micropostモデル
主キーはUserモデルのidで、外部キーがMicropostモデルのuser_idとなっています。

それぞれのモデルで以下のように宣言しています。

micropost.rb

1class Micropost < ApplicationRecord 2 belongs_to :user 3end

user.rb

1class User < ApplicationRecord 2 has_many :microposts 3end

###Railsのconsoleを使って、ユーザーとマイクロポストの関連付けを確認しました。
first_userに代入されたデータが最終行のコードで表示させたいです。

$first_user = User.first $first_user.microposts $micropost = first_user.microposts.first $micropost.user

チュートアルでは最終的にfirst_userのデータが表示されています。
しかし、以下のエラーが出ました。

Micropost Load (0.1ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 11]] NoMethodError (undefined method `user' for #<Micropost::ActiveRecord_Associations_CollectionProxy:0x000000000433b900>) Did you mean? super

試しに以下のコードを打つと、エラーが出ず、first_micropostのデータが表示されました、

$first_micropost = Micropost.first $first_micropost.user

userメソッドが定義されていない訳ではないと考えています。
二つのコードの違いは何なのでしょうか。
知識不足ですみません。教えていただけると嬉しいです。

meb4427👍を押しています

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

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

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

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

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

guest

回答1

0

エラーが出た時は where で検索していませんでしたか?
そのばあいは 複数の結果が返る可能性があるので Relation という classで返ってきます。ですので
undefined method `user' for 、、、Associations_CollectionProxy
となっています。 
Micropostのインスタンスで得るには
first, last, find, find_by
を使うか、若しくは microposts = Micropost.where() の結果に対して
microposts[0] とか midroposts.first とかして下さい。

投稿2019/12/12 07:41

winterboum

総合スコア23567

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

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

tabut

2019/12/12 11:20

回答ありがとうございます。micropost.userではmicropostに代入されたデータに紐づいたuserテーブルのレコードは取り出せないということでしょうか。質問ばかりになってしまいすみません。回答していただけるとありがたいです。
winterboum

2019/12/12 11:23

取り出せますよ。 first_micropost = Micropost.first first_micropost.user ではできたんでしょ。first_micropost は Micropost のインスタンスですから。 micropost = Micropost.where() micropost.user では駄目ですけどね、この場合のmicropostはMicropostのインスタンスでは無いですから
tabut

2019/12/12 13:27

回答ありがとうございます。 インスタンスについてもう復習します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問