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

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

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

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

Q&A

解決済

1回答

394閲覧

RSpec factory bot のアソシエーションについて

masakin

総合スコア3

Ruby on Rails 5

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

0グッド

0クリップ

投稿2023/03/22 04:18

実現したいこと

アソシエーションの挙動を理解したいです。
出力結果に対する私の解釈が正しいかご判断していただきたいです。

前提

今RSpecを学習している初心者です。
factory botというダミーデータ作成のgemを使っているのですが
私のアソシエーションの挙動の理解が浅いと自分で思っているので私の解釈が合っているかご判断していただきたいです。

私のコードと私のコードの解釈

データの関係性 user(owner)がprojectを持っておりprojectがnoteを持っている
1対1対1です。

spec/factories/users.rb FactoryBot.define do factory :user, aliases: [:owner] do first_name { "ロロノア" } last_name { "ゾロ" } sequence(:email) { |n| "tester#{n}@example.com" } password { "dottle-nouveau-pavilion-tights-furze" } end end
spec/factories/projects.rb FactoryBot.define do factory :project do sequence(:name) { |n| "Test Project #{n}" } description { "Sample project for testing purposes" } due_on { 1.week.from_now } association :owner end end
spec/factories/notes.rb FactoryBot.define do factory :note do message { "My important note." } association :project association :user end end
spec/models/note_spec.rb # ファクトリで関連するデータを生成する it "generates associated data from a factory" do note = FactoryBot.create(:note) puts "This note's project is #{note.project.inspect}" puts "This note's user is #{note.user.inspect}" end

↑このようにしてtestを走らせ作成されたデータを見ると

出力結果 This note's project is #<Project id: 2, name: "Test Project 5", description: "Sample project for testing purposes", due_on: "2023-03-29", created_at: "2023-03-22 02:21:02.527864000 +0000", updated_at: "2023-03-22 02:21:02.527864000 +0000", user_id: 2> This note's user is #<User id: 3, email: "tester10@example.com", created_at: "2023-03-22 02:21:02.545534000 +0000", updated_at: "2023-03-22 02:21:02.545534000 +0000", first_name: "ロロノア", last_name: "ゾ ロ", authentication_token: [FILTERED], location: nil>

出力結果の疑問と私の解釈
疑問
①user_id: 2とUser id: 3でuserが2人作成されている。

私の解釈

spec/factories/notes.rb FactoryBot.define do factory :note do message { "My important note." } association :project association :user end end

userが2人作成されたのは
factory notesのassociation :project⇦このアソシエーションでnoteを持ったprojectのuser(owner)が最初に作成され、その次にassociation :user⇦この表記によりprojectを持たないnoteを持ったuserが作成されているので結果userが2つ作成された。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「私の解釈」は合ってますが、その挙動は「1対1対1」では無いですね

FactoryBot.define do factory :note do message { "My important note." } association :project association :user end end

の association :user がおかしいです。
model のcode がないのでエスパーモードですが、Note に belongs_to :user してません?
そうすると、 Note は 直に関わるUserと属する Projectを通して関係付されるUserの二人と関係を持つことになります。
「1対1対1」ならば Note の belongs_to :user と、user_id を削除、ですね

投稿2023/03/26 03:16

winterboum

総合スコア23284

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問