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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

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

Q&A

解決済

1回答

2132閲覧

railsでのDB設計

PartyKids

総合スコア65

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

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

0グッド

0クリップ

投稿2017/10/03 00:49

編集2017/10/03 01:21

閲覧ありがとうございます!
初めてアプリケーションを作ってみようと挑戦している者です。
よろしくお願いいたします!

前提

rails5
ruby 2.4.1

例)
ハッピーセット1/coke:1個 /sprite:2個/ orange: 3個/ water: 4個
ハッピーセット2/coke:5個 /sprite:5個/ orange: 5個/ water: 5個
ハッピーセット3/coke:0個 /sprite:0個/ orange: 0個/ water: 0個/ milk: 12個

  • ドリンクのみで構成されている、ハッピーセットが数種類ある。
  • ドリンクの個数によって、ハッピーセットの名称が異なる。
  • ドリンク種類は固定ではない。

という内容です。

問題点&やったこと

上手く、オブジェクトからドリンクの個数が取り出したい。

初めは、coke等のドリンク名をカラムに持つハッピーセットテーブルを作成しました。

ruby

1create_table "happysets", force: :cascade do |t| 2 t.string "name" 3 t.integer "coke" 4 t.integer "sprite" 5 .......etc 6 end 7

が、これだとドリンクの種類が増える度にカラム名を追加しなければならず、構造的には正しくないと本に書いてあったため、ドリンクテーブルを作成、ハッピーセットテーブルとアソシエーションしました。

ruby

1create_table "drinks", force: :cascade do |t| 2 t.string "name" 3  ...etc 4 end 5 6create_table "happyset_drinks", force: :cascade do |t| 7 t.integer "happyset_id" 8 t.integer "drink_id" 9 ...etc 10 end 11

疑問1: 中間テーブルには外部キーのみしか入れないのですか?

has_many, has_many throughによってハッピーセットとドリンクテーブルを上手く連携させることが出来たのですが、個数をどう扱えばいいのか分からなかったので、一旦中間テーブルに入れてみました

ruby

1create_table "happyset_drinks", force: :cascade do |t| 2 t.integer "happyset_id" 3 t.integer "drink_id" 4 t.integer "quantity" 5 ...etc 6 end 7 8class HappysetDrink < ApplicationRecord 9 belongs_to :happyset 10 belongs_to :drink 11end 12 13class Drink < ApplicationRecord 14 has_many :happyset_drinks 15 has_many :happysets, through: :happyset_drinks 16end 17 18class Happyset < ApplicationRecord 19 has_many :happyset_drinks 20 has_many :drinks, through: :happyset_drinks 21end

Happyset.find(1).happyset_drinks.find_by(drink_id:1).quantityで個数を取得することが出来るのですが、どうも直感的な書き方では無いことに違和感を感じ質問させていただきました。
また自分なりに調べた所、中間テーブルには外部キーのみしか書かれていない物が多かったので、自分の考え間違っているのでは?と思いました。

よろしくお願いいたします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

Happyset.find(1).happyset_drinks.find_by(drink_id:1).quantityで個数を取得することが出来るのですが、どうも直感的な書き方では無いことに違和感を感じ質問させていただきました。
また自分なりに調べた所、中間テーブルには外部キーのみしか書かれていない物が多かったので、自分の考え間違っているのでは?と思いました。

中間テーブルにテーブル間の外部キー以外の属性を持たせる(今回の個数みたいなカラム)ことは全然ありえます。

今回のテーブル定義での個数の持たせ方もぱっと見は悪くないように見えます。

個数の取得も(私なりにですが)癖がある感じではないように見えますがどのあたりに違和感がある感じでしょうか?

投稿2017/10/05 01:56

balaenoptera

総合スコア222

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

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

PartyKids

2017/10/05 12:25

先日は助けて頂き、ありがとうございました。また、今回もありがとうございます! >テーブル定義での個数の持たせ方もぱっと見は悪くない&癖がある感じではない コメントありがとうございます!違和感があったのは、ハッピーセットオブジェクト(Happyset.drink...)で、ドリンク個数からハッピーセットを検索したかったのですが、出来なかったからです。例)coke2個のハッピーセットは何がある?とかです。 なぜドリンクオブジェクトからスタートしないかと申しますと、検索フォームのオブジェクトがHappysetだからです。 SQLのjoin等を使えば、ハッピーセットオブジェクトでも出来る?ことが分かったので、それで出来るか現在試行錯誤している最中です。 他に何か良いやり方をご存じありませんか? よろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問