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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

325閲覧

Rails5:多対多のmodelだけど、中間テーブルがいらず、ポリモーフィックでもない場合

dwayne_johnson

総合スコア86

Ruby on Rails 5

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/05/23 00:02

多対多のモデルの扱い

普通、多対多のモデルであれば中間テーブルを作成し、has_many :throughで関連付けを行うと思います。

また、1つのmodelが複数のmodelに所属している場合はポリモーフィック関連付けを使うと思います。

具体的な話

全部で3つのmodelがあります。
RestaurantStationGroupStation の3つです。

StationGroupは、多くのStationを持ちます。例を挙げますと、東京駅です。東京駅といっても山手線なのか東海道線なのか、横須賀線なのかでStationを分けて考えているため、それをまとめるのがStationGroupの東京駅です。つまり、

StationGroup has_many :stations Station belongs_to :station_group

Restaurantは、一つのStationGroupに属します。つまり

StationGroup has_many :restaurants Restaurant belongs_to :station_group

ここまでは問題ないのですが、イメージがつかめていないのはRestaurantStationの関連付けです。

RestaurantStationは、StationGroupを挟んで多対多の関係です。

しかしながら、普通の中間テーブルとは異なり、独自のidを持ちそれを媒介して2つのmodelがつながっています。ここでいう普通とは、こちらのような場合に関してです。

まだまだRailsに関して知識と経験がなく、これら2つはhas_many :throughで関連付けを行うべきものなのか、それとも別に関連付けを行うのか、はたまたこの2つは関連付けるべきでないのか判断に困っています。

よろしくお願いします。

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

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

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

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

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

space-hippy

2018/05/23 00:28

普通の中間テーブルとは異なり、独自のidを持ちそれを媒介して2つのmodelがつながっています。とありますが、通常の中間テーブルも固有のidがあると思うのですが、質問者様が想定されているのはどのような違いでしょうか?StationとRestaurantを一方向、または双方向に参照するのであれば、has_many :throughで関連付けてよいのではないかと思うのですが、質問の趣旨が分かっていなかったらすみませんm(__)m
dwayne_johnson

2018/05/23 10:25

あーすみません。通常の中間テーブルであれば、関連付けがあるmodelのIDを持つということです。例えば、自分の具体例におけるStationGroupが"普通"の中間テーブルであれば、restaurant_id と station_id を持ち、それに加えて自分固有のidを持つと思います。しかし、自分の愚かなモデル設計では、StationGroupはそれぞれのidを持たず、自分のidしか持ちません。代わりに、StationとRestaurantがstation_group_idを持ちます。つまり、RestaurantとStation側がStationGroupを参照している形です。にもかかわらず、StationとRestaurantにも関連付けを行いたいといったことを考えたため、破綻がいじたと思われます。説明不足ですみませんでした。コメントありがとうございました。
space-hippy

2018/05/23 10:35

解決後にも丁寧にお返事いただきありがとうございます(^^)/理解いたしました(*^^)v解決できたようで何よりです ^^) _旦~~
guest

回答1

0

ベストアンサー

モデルの関係性とは関係なく、そのようなモデル設計を行ったから陥ってしまっている問題だと思います。

Restaurantは良いとして、StationGroupではなくStation、路線をRouteとしてモデル定義すれば、

Station→(n:n)→Route
Station→(1:n)→Restaurant

の関係となり、RouteStationの関係において中間テーブルを準備すれば良いことになります。

投稿2018/05/23 02:34

sazi

総合スコア25138

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

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

dwayne_johnson

2018/05/23 10:26

そうですね。冷静に分析したら、無理がある設計でした。 今一度、考え直したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問