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

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

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

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

データベース設計

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

Q&A

0回答

1362閲覧

中間テーブルを用いたデータの保存について

zoomer

総合スコア1

Ruby

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

データベース設計

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

0グッド

0クリップ

投稿2020/11/09 09:42

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

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

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

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

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#GroupsController 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#views/groups/new.html.erb 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#GroupModel 2 3class Group < ApplicationRecord 4 extend ActiveHash::Associations::ActiveRecordExtensions 5 6 belongs_to :category 7 belongs_to :genre 8 9 has_many :group_users 10 has_many :users, through: :group_users, dependent: :destroy 11 # accepts_nested_attributes_for :group_users 12 has_many :messages, dependent: :destroy 13 14 has_one_attached :image 15 16 with_options presence: true do 17 validates :name, uniqueness: true 18 validates :text 19 validates :category_id 20 validates :genre_id 21 end 22 23 with_options numericality:{other_than: 1} do 24 validates :category_id 25 validates :genre_id 26 end 27 28end

model

1#UserModel 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#GroupUserModel 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.timestamps 11 end 12 end 13end 14

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ページで確認できます。

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問