アソシエーションについての学び

スクールの課題で、アソシエーションについて深い学びがあったので備忘録として書き留めておく。


私の使用したバージョンは以下です
```
ruby 3.2.2
rails 6.1.7.6
```
まず、前提から。
私が表現したかったのは、画面でいうと

![スクリーンショット 2023-10-26 17.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/6f712b9b-b503-4547-4103-8fc862149cff.png)

こんな感じで、田中マンションは、最寄駅をいくつでも登録できるようになっていて、登録した最寄駅情報が下にどんどん表示されるようになっている。（赤線の部分）
データベースのテーブル上は、appartmentsテーブルとstationsテーブルがあり、stationsテーブルが外部キーとしてappartment_idというカラムを持っている状態。![スクリーンショット 2023-10-26 17.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/03576468-d47f-bad1-7ce4-26af197df462.png)


```appartment.rb
class Appartment < ApplicationRecord
  has_many :stations, inverse_of: :appartment, dependent: :destroy
  accepts_nested_attributes_for :stations,allow_destroy: true, reject_if: :all_blank
end
```
```station.rb
class Station < ApplicationRecord
  belongs_to :appartment, inverse_of: :stations
end
```
```appartment.controller
def show
    @appartment = Appartment.find(params[:id])
end
```
```appartments/show.html.erb
<h1>詳細</h1>
  <div>
    <h3>物件名</h3>
    <%= @appartment.name %>
  </div>
    <h3>賃料</h3>
    <%= @appartment.price %>
    <h3>住所</h3>
    <%= @appartment.address %>
    <h3>築年数</h3>
    <%= @appartment.age %>
    <h3>備考</h3>
    <%= @appartment.remarks %>

    <% @appartment.stations.each do |station| %>
      <h3>路線名</h3>
      <%= station.route %>
      <h3>駅</h3>
      <%= station.station_name %>
      <h3>徒歩分数</h3>
      <%= station.time %>
    <% end %>
<p>
<%= link_to "一覧画面にもどる", appartments_path %>
</p>
```
さて、今回記事にしたいのは、show.html.erb、の中の、
```
<% @appartment.stations.each do |station| %>
      <h3>路線名</h3>
      <%= station.route %>
      <h3>駅</h3>
      <%= station.station_name %>
      <h3>徒歩分数</h3>
      <%= station.time %>
    <% end %>
```
の部分。
私は最初、この部分を
```
<% @appartment.each do |appartment| %>
      <h3>路線名</h3>
      <%= appartment.stations.route %>
      <h3>駅</h3>
      <%= appartment.stations.station_name %>
      <h3>徒歩分数</h3>
      <%= appartment.stations.time %>
    <% end %>
```
としていて、「アソシエーションについてかなり理解できてきたなあ」なんて自負していた（笑）それがどっこい、メンターさんに、これは間違いですよ、と指摘されてしまった。なぜか？
３行目と５行目と７行目、
```
      <%= appartment.stations.route %>
      <%= appartment.stations.station_name %>
      <%= appartment.stations.time %>
```
これは、一見アソシエーションの形で、表示できそうだけど、よくよく考えてみると、
appartmentの中身は、田中マンションのデータが入っている。
田中マンションは、stationsのデータを２つ持っている。（今回の例だと、芦花公園駅と八幡山駅）その状態で、1️⃣appartment.stations.station_name、や
2️⃣appartment.stations.time とすると、
1️⃣の方では、「私、芦花公園駅っていうのと、八幡山っていうの両方持ってるけど、どっちを出せばいいのー？？」、2️⃣の方では、「７分、８分、どっちー？」と困ってしまい表示できなくなってしまう。

その反面、
```
<% @appartment.stations.each do |station| %>
      <h3>路線名</h3>
      <%= station.route %>
      <h3>駅</h3>
      <%= station.station_name %>
      <h3>徒歩分数</h3>
      <%= station.time %>
    <% end %>
```
とすれば、
each文の前の、@appartment.stations、の部分に駅の情報が２つ入り、
each doの後の station　の中に、２つの情報が１つずつ入り、station.route、station.station_name、station.time、其々、その１つの駅の「route」と「station_name」と「time」を表示することができる！
なるほど！

ちなみにメンターさんによると、この、私が間違えた、「appartment.stations」というのは、
「ActiveRecord_Associations_CollectionProxy」というクラスにあたるそうです。![スクリーンショット 2023-10-27 15.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/0ebacce2-7659-4a46-13fa-2dd7009052fc.png)

この「ActiveRecord_Associations_CollectionProxy」については、もう少し学んでからいつか記事にできたらいいと思います！

本日はここまで〜！