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

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

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

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

Q&A

解決済

1回答

2051閲覧

グループ機能で、userをgroupに所属させる方法

tomtom1

総合スコア168

Ruby on Rails

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

0グッド

1クリップ

投稿2020/02/28 13:08

###実現したいこと
グループ機能を実装させたい。
現状、グループ機能の作成を完了しましたが、以下で手詰まりしています。
・グループにuserを所属させる。
おそらくgroup_user Modelに所属する人(user)と所属先(group)を代入すると考えています。その場合、group_userのControllerを作成し、createするのかなと思いましたが、参考サイトにはControllerの作成はないので、どのようにすべきか悩んでいます。user.rbで、has_many :groups, through: :group_usersと記載しているのですが、何らかの方法で摘出できるのかともわからずにいます。
→group/showにて、所属メンバーを一覧させますのが目的です。

参考サイト
https://qiita.com/savaniased/items/ce7dd5a825ad0f6be53c

###コード

Terminal

1$ rails g controller groups 2$ rails g model group 3$ rails g model group_user

migration

1class CreateGroups < ActiveRecord::Migration[5.2] 2 def change 3 create_table :groups do |t| 4    t.string :name 5 t.integer :user_id 6 t.text :content 7 t.timestamps 8 end 9 end 10end

migration

1class CreateGroupUsers < ActiveRecord::Migration[5.2] 2 def change 3 create_table :group_users do |t| 4 t.references :group, foreign_key: true 5 t.references :user, foreign_key: true 6 t.timestamps 7 end 8 end 9end

routes

1resources :groups, only: [:index, :new, :create, :edit, :update]

model

1#group.rb 2class Group < ApplicationRecord 3 has_many :group_users 4 has_many :users, through: :group_users 5end 6#group_user.rb 7class GroupUser < ApplicationRecord 8 belongs_to :group 9 belongs_to :user 10end 11#user.rb 12class User < ApplicationRecord 13 has_many :group_users 14 has_many :groups, through: :group_users 15end

Controller

1class GroupsController < ApplicationController 2 def index 3 @groups = Group.all 4 end 5 def new 6 @group = Group.new 7 @group.users << @current_user 8 end 9 10 def create 11 @group = Group.new( 12 name: params[:name], 13 user_id: @current_user.id, 14 content: params[:content]) 15 if @group.save 16 flash[:notice] = "新しいグループを作成しました" 17 redirect_to("/groups/") 18 else 19 render :new 20 end 21 end 22 23 private 24 def group_params 25 params.require(:group).permit(:name, :user_id, :content) 26 end 27end

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

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

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

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

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

winterboum

2020/02/28 14:34

1個人は複数のグループに入ることができるのですね?
tomtom1

2020/02/28 14:50

はい、複数のグループに所属することができます!
guest

回答1

0

ベストアンサー

多対多で UserをGroupに関連つけるには
user0 = User.find_by() なUser に 
ある一つのgrop と関連を追加するには
user0.groups << group
複数のgroupをどうじに追加するには
user0.groups << [group,group,group]
とか
user0.groups << Group.where()

そうとっかえなら
user0.groups = group
user0.groups = [group,group,group]
user0.groups = Group.where()

投稿2020/02/29 00:26

winterboum

総合スコア23284

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

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

tomtom1

2020/02/29 06:24

ご回答ありがとうございます。 ある一つのgrop と関連を追加するにはuser0.groups << group ↑ このような方法があるのですね。知らなかったです。つまりは、私の提示しているコードでは、group.new時点で、@current_userが@group.usersに代入されているということですね。 私自身引き続き調べてみますが、まだわからないのが、そもそも@group.usersはどこになりますか?それはGroup_userモデルと関係がありますか?そして、その場合、viewでグループに所属しているユーザーの一覧を出すにはどのような定義になりますか?
winterboum

2020/02/29 07:33

>group.new時点で、@current_userが@group.usersに代入されている@group.users << @current_user ⇐ この時点です あ、  多対多ですからgroup、user対等ですので、group.usersに<<userしても同じです > @group.usersはどこになりますか? 意味不明です > グループに所属しているユーザーの一覧 group.users
tomtom1

2020/02/29 10:06

ありがとうございます。 > @group.usersはどこになりますか? 意味不明です ↑Groupモデルには、user_idというカラムはありますが、userというカラムはありません。  そして、Groupモデルのuser_idには、グループ作成者idを代入しています。  今回@group.usersのデータはどちらに登録されるのでしょうか?group_userモデルでしょうか?
winterboum

2020/02/29 13:00 編集

多対多の関係は、GroupUserという中間tableによって関係つけられます。 このtableの user_id に 登録されます
tomtom1

2020/02/29 13:39

GroupUserという中間tableのuserにでよろしいですか? また、その場合、コンソールでGroupUser.allを行っても何も登録されませんが、newではなくcreateの方に書き換えた方がいいですか? 今お教え頂いていることで、理解は深まっていますが、残念ながら解決には至っておりません。
tomtom1

2020/02/29 13:39

また、user0.groups << groupの方法について理解をできていないことから、進められずにいると思います。この手法をどのようなワードで調べてたら、検索できますか?
winterboum

2020/02/29 14:03

GroupUser は作ってありますね? で、GroupUser.all は登録はしないです。 >newではなくcreateの方に書き換えた方がいいですか? ここの意味がわかりません。newとはcontrollerのactinのことを言ってますか? でしたらcreateの方です。 今載っているcodeではcreateのなかで group.users << user をやっていないので関連つけられていません
tomtom1

2020/02/29 19:18

GroupUser は作ってありますね?で、GroupUser.all は登録はしないです。 ↑GroupUserは、すでに上記に記載した通りgenerate model で作成していますが、ごめんなさい、ご質問の意味がわからないです。。 ここの意味がわかりません。newとはcontrollerのactinのことを言ってますか? でしたらcreateの方です。今載っているcodeではcreateのなかで group.users << user をやっていないので関連つけられていません ↑単純にその方法がわからないという質問でテラテイルに質問の投稿をさせて頂いております。その方法のご回答を頂きたいたいです、ご回答いただけない場合でも、ヒントでもいただけないかと思っています
winterboum

2020/02/29 21:53

今載っているcodeではcreateのなかで group.users << user をやっていないので関連つけられていません saveが成功したら、 group.users << user してください。 <<するuserは所属させたいuserです
tomtom1

2020/03/02 09:40

winterboumさん、ありがとうございます!理解が進み、group.users << userが何を意図しているのか理解しました。そして、createに入れること把握しました!
tomtom1

2020/03/02 09:42

no1knowsさん、ありがとうございます。多対多のアソシエーションということだったのですね、特にご教示頂いた一つ目のサイトは、今回の取り組みと非常に似ていたことから大変理解に繋がり、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問