前提・実現したいこと
今、CtoCで旅行の案内ができる人と案内してほしい人をマッチングさせるアプリを制作しておりまして、
旅行の案内をする人をツアーキャスト、旅行の案内を受ける人をツアーゲストと定義しています。
そしてツアーキャスト、ツアーゲスト両方とも投稿することができ、
その投稿に対しては複数のユーザーが申し込むことができるように実装したいです。
ここでは、ツアーキャストとしての投稿のモデルをPostC
、ツアーゲストとしての投稿のモデルをPostG
としています。
また、その投稿を申し込む人のことをtaker
と定義し、taker
は複数人いても良いのでPostC
とtaker
は多対多の関係とします。
PostG
とtaker
の関係も同様です。
さらに、申し込み済みのツアーキャストの投稿をtaking_post_cs
、ツアーゲストの投稿をtaking_post_gs
と定義しています。
ユーザーのマイページで、そのユーザーが申し込んだ投稿を一覧で見られるようにしたいのですが、
エラーが表示されてしまうので、解決法を教えていただけると助かります。
発生している問題・エラーメッセージ
ActiveRecord::HasManyThroughSourceAssociationNotFoundError in UsersController#show Could not find the source association(s) :post_g in model PostGTaker. Try 'has_many :taking_post_gs, :through => :post_g_takers, :source => <name>'. Is it one of taking_post_g or taker?
該当のソースコード
▼models/user.rb
Ruby
1class User < ApplicationRecord 2 3 has_many :post_g_takers 4 has_many :taking_post_gs, through: :post_g_takers, source: :post_g 5 has_many :post_c_takers 6 has_many :taking_post_cs, through: :post_c_takers, source: :post_c 7 8end
▼models/post_g.rb
Ruby
1class PostG < ApplicationRecord 2 has_many :post_g_takers 3 has_many :takers, through: :post_g_takers 4end
▼models/post_g_taker.rb
Ruby
1class PostGTaker < ApplicationRecord 2 belongs_to :taking_post_g, class_name: 'PostG', foreign_key: 'taker_id' 3 belongs_to :taker, class_name: 'User', foreign_key: 'taker_id' 4end
▼users_controller.rb
Ruby
1class UsersController < ApplicationController 2 3 def show 4 @user = User.find(params[:id]) 5 @taking_post_gs = @user.taking_post_gs 6 @taking_post_cs = @user.taking_post_cs 7 end 8 9end
▼views/users/show.html.haml
haml
1.Title 2 = "#{@user.name}さんのページ" 3 4.User_page_tabs 5 - if user_signed_in? && @user.id == current_user.id 6 = link_to "申込済み(ツアーゲスト)", "#", class: "User_page_tab" 7 = link_to "申込済み(ツアーキャスト)", "#", class: "User_page_tab" 8 9.User_posts 10 - if @taking_post_gs.empty? 11 .Empty 投稿がありません 12 - else 13 .Post_index 14 - @taking_post_gs.each do |post| 15 = render partial: "posts_g/post", locals: { post: post } 16.User_posts 17 - if @taking_post_cs.empty? 18 .Empty 投稿がありません 19 - else 20 .Post_index 21 - @taking_post_cs.each do |post| 22 = render partial: "posts_c/post", locals: { post: post }
▼schema.rb
Ruby
1ActiveRecord::Schema.define(version: 2020_09_08_123347) do 2 3 create_table "post_c_takers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 4 t.bigint "post_c_id" 5 t.bigint "taker_id" 6 t.datetime "created_at", precision: 6, null: false 7 t.datetime "updated_at", precision: 6, null: false 8 t.index ["post_c_id"], name: "index_post_c_takers_on_post_c_id" 9 t.index ["taker_id"], name: "index_post_c_takers_on_taker_id" 10 end 11 12 create_table "post_cs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 13 t.string "region", null: false 14 t.string "datetime", null: false 15 t.text "content", null: false 16 t.string "charge", null: false 17 t.bigint "giver_id", null: false 18 t.datetime "created_at", precision: 6, null: false 19 t.datetime "updated_at", precision: 6, null: false 20 t.string "title", null: false 21 t.string "payment", null: false 22 t.string "image" 23 t.index ["giver_id"], name: "index_post_cs_on_giver_id" 24 t.index ["region"], name: "index_post_cs_on_region" 25 end 26 27 create_table "post_g_takers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 28 t.bigint "post_g_id" 29 t.bigint "taker_id" 30 t.datetime "created_at", precision: 6, null: false 31 t.datetime "updated_at", precision: 6, null: false 32 t.index ["post_g_id"], name: "index_post_g_takers_on_post_g_id" 33 t.index ["taker_id"], name: "index_post_g_takers_on_taker_id" 34 end 35 36 create_table "post_gs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 37 t.string "region", null: false 38 t.string "datetime", null: false 39 t.text "content", null: false 40 t.string "charge", null: false 41 t.bigint "giver_id", null: false 42 t.datetime "created_at", precision: 6, null: false 43 t.datetime "updated_at", precision: 6, null: false 44 t.string "title", null: false 45 t.string "payment", null: false 46 t.string "image" 47 t.index ["giver_id"], name: "index_post_gs_on_giver_id" 48 t.index ["region"], name: "index_post_gs_on_region" 49 end 50 51 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 52 t.string "name", null: false 53 t.string "email", default: "", null: false 54 t.string "encrypted_password", default: "", null: false 55 t.text "profile" 56 t.string "profile_image" 57 t.string "reset_password_token" 58 t.datetime "reset_password_sent_at" 59 t.datetime "remember_created_at" 60 t.datetime "created_at", precision: 6, null: false 61 t.datetime "updated_at", precision: 6, null: false 62 t.index ["email"], name: "index_users_on_email", unique: true 63 t.index ["name"], name: "index_users_on_name", unique: true 64 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 65 end 66 67 add_foreign_key "post_c_takers", "post_cs" 68 add_foreign_key "post_c_takers", "users", column: "taker_id" 69 add_foreign_key "post_cs", "users", column: "giver_id" 70 add_foreign_key "post_g_takers", "post_gs" 71 add_foreign_key "post_g_takers", "users", column: "taker_id" 72end
試したこと
user.rb
のsourceの部分をsource: :taking_post_g
にしてみたところ、別のエラーが出ました。
しかし、以下のサイトを見てsourceは実在するモデル名ではないといけないのでは?と思い、上記にはpost_g
と書いたコードを載せました。
https://kimuraysp.hatenablog.com/entry/2017/09/05/235816
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/09 03:02
2020/09/09 03:25
2020/09/09 04:25
2020/09/09 04:30