質問: Room.find(params[:id]).reservations ``` のようにしておくと 中間テーブルの役割を果たす`plans`が中でJoinされて [予約プランが一つでもないと予約状況が参照できない]状態となります。 そのため `reservations`に`room_id`を追加して直接参照したいのですが `plans`にも`room_id`があるためDB設計的に冗長なのではと感じてます。 この場合、どのように設計をすれば良いでしょうか。
回答: `Reservation`に`room_id`を追加した場合、`Reservation`と`Room`の間に`Reservation`-`Plan`-`Room`という関連と、`Reservation`-`Room`という2経路の関連が出来ることになるので、この整合性を担保する必要があります。 整合性の担保は * モデルを使う側に押しつける * モデルの側でコールバックなどを使って実現する * DB側でトリガなどで実現する 等考えられますが、いずれにせよ結構面倒です 複数経路での関連が生じるのは直ちにNGではないのですが、本当に必要性があるのか、設計で回避できないのかは検討する必要があるでしょう。 ところで、このモデル設計では、一般的には可能でなければならないはずの「一つの予約で複数の部屋を申し込む」ということが管理できません。また「予約プラン」というのが単なる中間テーブルなのか、いわゆる「スタンダードプラン」とか「レディースプラン」とかの「プラン」なのかどちらとも読み取れるのですが、どちらであるにしても違和感があります。そもそもの設計に問題があるような気がします。