質問: Spot.all # view <% @spots.each do |from| %> //縦のループ <%=from.name%> <% @spots.each do |to| %> // 横のループ <% end %> <% end %> ``` このようにSpotsテーブルのデータを入れ子でループして、table要素で表を作っています。 POSTされたデータはPointsテーブルへINSERTされます。 前置きが長くなりましたが、ここからが問題で、、 「新規登録時は上記でよいが、更新時はどのデータを取得してviewに展開すればよいか」で悩んでおります。 * 登録したpointデータはPointsテーブルにあるので、Pointsテーブルからのデータを取得して展開しようすると、Pointsテーブルに存在しない組み合わせのデータが展開できない。 * 登録時にすべての組み合わせのデータをPointsテーブルにINSERTしておけばレコードは登録できるが、あとからspotsテーブルのデータが追加された場合、やはりPointsテーブルにデータがないのでviewに展開できない。 * CROSS JOIN と LEFT JOINでがんばってviewに展開しやすい形に加工して取ってくるやり方がありそうだが、CROSS JOIN以外の方法で何とかならないか。 分かりにくい説明で恐縮ですが、何かアドバイスいただければ幸いです。 実ソースでなく、考え方だけでも結構です。 RailsとPHPのタグをつけましたが、言語というよりは考え方の質問なので言語は問いません。 よろしくお願いいたします。
回答: いろいろ考え方がありますが・・・ おそらくご想定されてると思われる、総当たりの表を導出する方法については以下のようにすれば良いと思います。 SpotsテーブルのIDの、直積集合を導出します。 select a.ID as FROM_ID, b.ID as TO_ID from Spots a, Spots b これに、Points テーブルを外部結合させれば、おそらく目的の総当たり表が導出できます。 select x.FROM_ID, x.TO_ID, y.point from (select a.ID as FROM_ID, b.ID as TO_ID from Spots a, Spots b) x left join Points y on y.from_spot_id = x.FROM_ID and y.to_spot_id = x.TO_ID