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

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

ただいまの
回答率

90.99%

  • Ruby on Rails

    6219questions

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

  • データベース

    627questions

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

  • データベース設計

    119questions

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

railsでのDB設計

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 296

PartyKids

score 57

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

前提

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等のドリンク名をカラムに持つハッピーセットテーブルを作成しました。

create_table "happysets", force: :cascade do |t|
    t.string   "name"
    t.integer   "coke"
    t.integer   "sprite"
    .......etc
  end


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

create_table "drinks", force: :cascade do |t|
    t.string   "name"
  ...etc
  end

create_table "happyset_drinks", force: :cascade do |t|
    t.integer  "happyset_id"
    t.integer  "drink_id"
    ...etc
  end

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

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

create_table "happyset_drinks", force: :cascade do |t|
    t.integer  "happyset_id"
    t.integer  "drink_id"
    t.integer "quantity"
    ...etc
  end

class HappysetDrink < ApplicationRecord
  belongs_to :happyset
  belongs_to :drink
end

class Drink < ApplicationRecord
  has_many :happyset_drinks
  has_many :happysets, through: :happyset_drinks
end

class Happyset < ApplicationRecord
  has_many :happyset_drinks
  has_many :drinks, through: :happyset_drinks
end


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/05 21:25

    先日は助けて頂き、ありがとうございました。また、今回もありがとうございます!

    >テーブル定義での個数の持たせ方もぱっと見は悪くない&癖がある感じではない
    コメントありがとうございます!違和感があったのは、ハッピーセットオブジェクト(Happyset.drink...)で、ドリンク個数からハッピーセットを検索したかったのですが、出来なかったからです。例)coke2個のハッピーセットは何がある?とかです。
    なぜドリンクオブジェクトからスタートしないかと申しますと、検索フォームのオブジェクトがHappysetだからです。

    SQLのjoin等を使えば、ハッピーセットオブジェクトでも出来る?ことが分かったので、それで出来るか現在試行錯誤している最中です。

    他に何か良いやり方をご存じありませんか?

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

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6219questions

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

  • データベース

    627questions

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

  • データベース設計

    119questions

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