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

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

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

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

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

1回答

1659閲覧

中間テーブルに保存したい。

zoomer

総合スコア1

Ruby

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

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/11/10 06:55

編集2020/11/11 01:24

閲覧して頂き、ありがとうございます。

かなり長文になってしまいましたが、ご確認頂き、アドバイス頂けますと幸いです。

よろしくお願い致します。

実現したい機能とデータベース設計

mixiのコミュニティ(当アプリではgroup)のような機能のアプリを作成しております。

そのためにはデータベース設計として、

groupテーブル
userテーブル
中間テーブルとしてgroup_users

が必要であると考えました。

保存の手順としては、

手順1.ログインしたユーザーはgroupを作成でき、作成されるとgroupテーブルにgroupの情報が保存され、中間テーブルであるgroup_usersテーブルに作成されたgroupのidと作成したuserのidが保存される。(views/groups/new.html.erbのgroup作成フォーム)

手順2.作成されたグループに新たなユーザーが参加した際は、中間テーブルであるgroup_usersテーブルに参加したgroupのidと参加したuserのidが保存される。(views/groups/index.html.erbのgroup参加フォーム)

という二段階のデータベース設計が必要かと考えました。

mixiのコミュニティのような機能を作成する際はこのようなデータベース設計、フォームの実装で方向性は間違っていませんでしょうか?

#現状の実装とエラーについて
現状は、

1.groupモデル、userモデル、group_usersテーブルの実装
2.groupコントローラー、userコントローラーの実装
3.deviseの実装
4.ルーティングの設定
5.viewの実装とformの作成
6.groupコントローラーの編集を行いました。

上記の手順で実装を行いました。

ですが、データベース設計の手順1.の部分の作成されたgroupのデータはgroupテーブルに保存は出来ていましたが、中間テーブルにはgroup_idとuser_idが保存されない状態でした。

※下記classについては過去に作成したアプリから引用しておりますので、ズレているところがあります。

###groupテーブルのみ保存された時のコントローラーとview

controler

1#Groupsのコントローラー 2class GroupsController < ApplicationController 3 4 def new 5 @group = Group.new 6 end 7 8 def index 9 @groups = Group.all 10 @groups = Group.order("created_at DESC") 11 end 12 13 def create 14 @group = Group.new(group_params) 15 if @group.save 16 redirect_to root_path 17 else 18 render :new 19 end 20 end 21 22 private 23 24 def group_params 25 params.require(:group).permit(:name, :text, :category_id, :genre_id, :image, {user_id: []} ) 26 end 27 28end

view

1#groups/new.html.erbのview 2 3<div class='chat-room-form'> 4 <h1>新規グループ作成</h1> 5 <%=form_with model: @group, local: true do |f|%> 6 7 <%# user_idを送るための記述 %> 8 <div class='group-room-form__field--left'> 9 <%= f.label :メンバー, class: 'group-room-form__label'%> 10 </div> 11 <div class='group-room-form__field--right'> 12 <%= text_field_tag 'group[user_id]', current_user.id %> 13 </div> 14 <%# //user_idを送るための記述 %> 15 16 <div class='group-form__field'> 17 <div class='group-room-form__field--left'> 18 <%= f.label :グループ名, class: 'group-room-form__label'%> 19 </div> 20 <div class='group-room-form__field--right'> 21 <%= f.text_field :name, class: 'group__room_name group-room-form__input', placeholder: 'グループ名を入力してください'%> 22 </div> 23 <div class="group-room-form__field--left"> 24 <%= f.label :image, "グループアイコン" %><br /> 25 <%= f.file_field :image %> 26 </div> 27 <div class='group-room-form__field--left'> 28 <%= f.label :カテゴリー, class: 'group-room-form__label'%> 29 </div> 30 <div class='group-room-form__field--right'> 31 <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"group-select"}) %> 32 </div> 33 <div class='group-room-form__field--left'> 34 <%= f.label :ジャンル, class: 'group-room-form__label'%> 35 </div> 36 <div class='group-room-form__field--right'> 37 <%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"group-select"}) %> 38 </div> 39 <div class='group-room-form__field--left'> 40 <%= f.label :グループ説明, class: 'group-room-form__label'%> 41 </div> 42 <div class='group-room-form__field--right'> 43 <%= f.text_field :text, class: 'group__room_name group-room-form__input', placeholder: 'どんなグループ?'%> 44 </div> 45 </div> 46 <div class='group-form__field'> 47 <div class='group-form__field--left'></div> 48 <div class='group-form__field--right'> 49 <%= f.submit class: 'group-form__action-btn'%> 50 </div> 51 </div> 52 <% end %> 53</div>

user_idを送る記述がおかしいと思い、user_idを送るための記述を下記のように記述したらgroupも保存されませんでした。
<div class='chat-room-form__field--right'> <input name="[user_ids][]" type="hidden" value=<%= current_user.id %>> </div>

また、これ以外にも様々試みましたが、いずれも保存は出来ず、use_idが取得出来ませんでした。

そもそものデーターベース設計、または、送るデータの記述が間違っているのでしょうか?

アドバイス頂けましたら幸いです。

その他の関連するコード

model

1#Groupモデル 2 3class Group < ApplicationRecord 4 extend ActiveHash::Associations::ActiveRecordExtensions 5 6 has_one :category 7 has_one :genre 8 9 has_many :group_users 10 has_many :users, through: :group_users, dependent: :destroy 11 has_many :messages, dependent: :destroy 12 13 has_one_attached :image 14 15 with_options presence: true do 16 validates :name, uniqueness: true 17 validates :text 18 validates :category_id 19 validates :genre_id 20 end 21 22 with_options numericality:{other_than: 1} do 23 validates :category_id 24 validates :genre_id 25 end 26 27end

model

1#Userモデル 2 3class User < ApplicationRecord 4 # Include default devise modules. Others available are: 5 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 10 11 validates :nickname, presence: true 12 validates :password, presence: true 13 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze 14 validates_format_of :password, with: PASSWORD_REGEX 15 with_options presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]+\z/} do 16 validates :last_name 17 validates :first_name 18 end 19 with_options presence: true, format: { with: /\A[ァ-ン]+\z/} do 20 validates :last_name_kana 21 validates :first_name_kana 22 end 23 validates :birthday, presence: true 24 25 has_many :group_users 26 has_many :groups, through: :group_users 27 # accepts_nested_attributes_for :group_users 28 29 has_many :messages 30end 31

model

1#GroupUserモデル 2 3class GroupUser < ApplicationRecord 4 belongs_to :group 5 belongs_to :user 6end

migration

1#GroupUsersのマイグレーションファイル 2 3class CreateGroupUsers < ActiveRecord::Migration[6.0] 4 def change 5 create_table :group_users do |t| 6 t.references :group, foreign_key: true 7 t.references :user, foreign_key: true 8 t.timestamps 9 end 10 end 11end

migration

1#Groupのマイグレーションファイル 2 3class CreateGroups < ActiveRecord::Migration[6.0] 4 def change 5 create_table :groups do |t| 6 t.string :name, null: false 7 t.text :text, null: false 8 t.integer :category_id, null: false 9 t.integer :genre_id, null: false 10 t.references :user, foreign_key: true 11 t.timestamps 12 end 13 end 14end 15

migration

1#userの関係のある部分のマイグレーションファイル 2 3create_table :users do |t| 4 ## Database authenticatable 5 t.string :nickname, null: false 6 t.string :email, null: false, default: "" 7 t.string :encrypted_password, null: false, default: "" 8 t.string :last_name, null: false 9 t.string :first_name, null: false 10 t.string :last_name_kana, null: false 11 t.string :first_name_kana, null: false 12 t.date :birthday, null: false 13 t.integer :category 14 t.integer :genre 15

長文になってしまいましたが、お読み頂きありがとうございます。

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

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

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

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

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

winterboum

2020/11/10 14:00

手順1の話ということですね? モデルGroupの関連定義を載せてください
zoomer

2020/11/11 01:26

回答ありがとうございます。 は、手順1の話です。 groupモデル、コントローラー、マイグレーションファイル userモデル、マイグレーションファイル group_usersのモデル、マイグレーションファイル 記載致しました。 ご確認頂けますと幸いです。 よろしくお願い致します。
guest

回答1

0

方法は大きく分けて2つあります。
ひとつは create で @group.save 成功した後
@group.users = current_user
これはgroup作成時はcurrent_userしか入れないからこれで良いです。

ふたつ目は、この後の手順2でも使える方法で

  1. モデル Groupに accepts_nested_attributes_for :group_users
  2. viewの<%=form_with の中に

f.fields_for :griup_users do |griup_user| user.hidden_field :user_id
3. controller の group_params に group_users_attributes: :user_id を追加

投稿2020/11/11 01:55

winterboum

総合スコア23347

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

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

zoomer

2020/11/11 02:13

ご回答ありがとうございます。 重ね重ねの質問で申し訳ありません。 上記のご指摘頂いた一つめのコントローラーで保存記述をする場合は、今記載しているviewのform内にある <%# user_idを送るための記述 %> <div class='group-room-form__field--left'> <%= f.label :メンバー, class: 'group-room-form__label'%> </div> <div class='group-room-form__field--right'> <%= text_field_tag 'group[user_id]', current_user.id %> </div> <%# //user_idを送るための記述 %> のような記載は不要ということでしょうか?
zoomer

2020/11/11 02:38

ありがとうございます。 上記のuser_idを送るための記述を削除して、ご指摘頂きました @group.users = current_user を@group.saveの下に記述して `if @group.save @group.users = current_user redirect_to root_path` と記載した際に undefined method `each' for #<User:0x00007fcd555b88d8> という表示が出て、eachはviewに記載されているので、viewに記載が必要なのかと考えておりました。 おそらく他のところが間違えているかと思いますので、 @group.users = current_user をベースにエラー箇所を潰していきます。 ありがとうございます。
winterboum

2020/11/11 11:19

念の為 @group.users = [current_user] も試してください undefined method  がデタ時のエラーメッセージを見たいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問