知らなかった、と言ったな。あれは嘘だ。
はい。
先日、Ecto.Changeset.change/2 知らなかった - mmagというエントリを書いたのですが、前に自分が書いたコードでchange/2
使ってました。はい、知ってました。
例えば、User
とOrganization
がmany_to_many
な関係にあるとします。あるユーザを、ある団体に入れたいとしましょう。
user = Repo.get!(User, 1) org = Repo.get!(Organization, 1)
Ectoではこういうとき、put_assoc/4
を使って以下のようにやる方法が用意されています。
user |> Repo.preload(:organizations) |> Ecto.Changeset.change |> Ecto.Changeset.put_assoc(:organizations, [org]) |> Repo.update
user
のorganizations
にorg
を入れた上で、user
をupdate
するという感じです。このときのorganizations
にあたるassociationはpreloadしておく必要があります。忘れていても、エラーメッセージが結構わかりやすく教えてくれたりもしますが。