mmag

ハマったことメモなど

知らなかった、と言ったな。あれは嘘だ。

はい。

先日、Ecto.Changeset.change/2 知らなかった - mmagというエントリを書いたのですが、前に自分が書いたコードでchange/2使ってました。はい、知ってました。

例えば、UserOrganizationmany_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

userorganizationsorgを入れた上で、userupdateするという感じです。このときのorganizationsにあたるassociationはpreloadしておく必要があります。忘れていても、エラーメッセージが結構わかりやすく教えてくれたりもしますが。