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

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

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

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

Q&A

解決済

1回答

1276閲覧

グループの管理者がわかるようにしたい

shawn_709

総合スコア13

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/26 10:29

編集2020/11/26 11:11

ご回答いただけるとありがたいです。よろしくお願いします!

前提・実現したいこと

グループを作成したユーザーがそのグループの管理者になる。
※そのグループを作ったユーザーが誰かわかるようにしたい。
ユーザーはdeviseを使用している。

発生している問題

現在のテーブル・モデルからでは、どのユーザーがどのグループを作ったかわからない。

該当のソースコード

migration

1#groups 2class CreateGroups < ActiveRecord::Migration[6.0] 3 def change 4 create_table :groups do |t| 5 t.string :name, null: false, unique: true 6 t.string :content 7 t.timestamps 8 end 9 end 10end 11 12#group_users 13class CreateGroupUsers < ActiveRecord::Migration[6.0] 14 def change 15 create_table :group_users do |t| 16 t.references :group, foreign_key: true 17 t.references :user, foreign_key: true 18 t.timestamps 19 end 20 end 21end

model

1#group 2class Group < ApplicationRecord 3 has_many :group_users 4 has_many :users, through: :group_users 5 has_many :tweets 6 7 validates :name, presence: true, uniqueness: true 8end 9 10#user 11class User < ApplicationRecord 12 devise :database_authenticatable, :registerable, 13 :recoverable, :rememberable, :validatable 14 15 validates :nickname, presence: true 16 17 has_many :group_users 18 has_many :groups, through: :group_users 19 has_many :tweets 20 has_many :groups 21end

controller

1#group 2class GroupsController < ApplicationController 3 before_action :authenticate_user!, only: :new 4 5 def index 6 end 7 8 def new 9 @group = Group.new 10 @group.users << current_user 11 end 12 13 def create 14 @group = current_user.groups.new(group_params) 15 if current_user.save 16 redirect_to group_tweets_path(@group) 17 else 18 render :new 19 end 20 end 21(省略) 22end

###試したこと
rails db:rollbackでマイグレーションファイルの編集できるようにしてから、groupsテーブルを以下のように変更。

migrate

1#groups 2class CreateGroups < ActiveRecord::Migration[6.0] 3 def change 4 create_table :groups do |t| 5 t.string :name, null: false, unique: true 6 t.string :content 7 t.references :user #この行を追加 8 t.timestamps 9 end 10 end 11end

アソシエーションを変更

model

1#group 2class Group < ApplicationRecord 3 has_many :group_users 4 has_many :users, through: :group_users 5 has_many :tweets 6 belongs_to :user #この行を追加 7 8 validates :name, presence: true, uniqueness: true 9end

上記の2つを変更したら、新規グループを作成できませんでした。ちなみに、変更前は新規グループ作成可。中間テーブルを使っているので、無理矢理アソシエーションを組んだことが原因だと考えています。

以上になります。ご助言いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Userモデルに同じ名前の関連付けがあるのがマズイです。

ruby

1 has_many :groups, through: :group_users 2 has_many :groups

ふたつめのhas_many :groupsを別の名前にしてみます。

ruby

1has_many :owned_groups, class_name: "Group" 2

これでUser.find(1).groupsUser.find(1).owned_groupsと関連付けることができました。

あとはGroupsControllerのcreateを

ruby

1current_user.owned_groups.new(group_params) 2

に書き換えてグループを作成してみてください。

has_manyのオプション(今回はclass_name)については以下をご確認ください。
has_many関連付けの詳細

投稿2020/11/27 03:35

neko_daisuki

総合スコア2090

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

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

shawn_709

2020/11/27 03:48

ご丁寧な説明ありがとうございます!すごくわかりやすく、感動しています! 1点追加で質問があります。 migrationファイルを書き換えて、groupsテーブルの中にowned_groupsカラムは用意しますか?
neko_daisuki

2020/11/27 03:51

用意しなくても大丈夫です。 普通のhas_many :groupsと同じようにGroupのuser_idと関連付けられます。 関連付けの名前(groups)がowned_groupsに変わっただけです。
shawn_709

2020/11/27 05:40

ありがとうございます!! neko_daisukiさんが教えて下さったコードを書いたら、groupsテーブルのuser_idカラムに作成者のidが記述されました。 重ね重ね申し訳ありません。 この場合、その作成者の名前をビューで表示しようとするとどういうコードになりますか? @group.user.nicknameや@group.user_id.nicknameなど様々なパターンを試して記述してもエラーばかりで。user_idは取得できるんですが、usersテーブルのnicknameを引っ張ってこれなく。
neko_daisuki

2020/11/27 05:52

group.rb に belongs_to :user があるのなら、@group.user.nickname でいけるはずです。 @group.user_id が空の @group で.user.nickname とするとエラーになります。 <%= @group.user ? @group.user.nickname : "不明" %> とか書くと分かりやすいと思います。
shawn_709

2020/11/27 06:59

完全にできました!! 本当にありがとうございます! 自分の質問に反応があっただけで感動していたのに、解決してくださりより感動しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問