becomes と 単一継承テーブル

単一継承テーブルしてる複数のモデルで、同一のformを使うとするとActiveRecord::Persistence#becomesメソッドを使うと思う。
このbecomesメソッドはコントローラーで使ったほうがいいよという話。

今までの自分はform_forメソッドの引数へ直接becomesを書いていた。
これだと、controllerでbuild_hogeを実行し、インスタンスが関連付いたのに、becomesによってSpotクラスのインスタンスになると、hogeへの参照がなくなってしまう。

<%= form_for([:admin, @spot.becomes(Spot)]) do |f| %>
...

そのため、nested_attributeの関連にこっそりnilが入っているので、入力項目が表示されなかったことが起きた。
永続化する前なので当たり前っぽい。

[2] pry(main)> spot = Spot.new
=> #<Spot id: nil, title: nil, traffic_route: nil>
[3] pry(main)> spot.metadata
=> nil
[4] pry(main)> spot.build_metadata
=> #<Metadata id: nil, title: nil, description: nil, created_at: nil, updated_at: nil, keywords: nil, metadatable_type: "Spot", metadatable_id: nil>
[5] pry(main)> spot.metadata
=> #<Metadata id: nil, title: nil, description: nil, created_at: nil, updated_at: nil, keywords: nil, metadatable_type: "Spot", metadatable_id: nil>
[6] pry(main)> spot = spot.becomes(Spot)
=> #<Spot id: nil, title: nil, traffic_route: nil>
[7] pry(main)> spot.metadata
=> nil