使用Ecto v2.2.6,Phoenix 1.3
我正在尝试播种使用phx.gen.json
创建的链接表。
首先,一个简单的链接表。我创建了一个User模型,一个Groups模型,以及一个以多对多关系连接它们的链接表。
主要表格:
mix phx.gen.json Account User users email:string
mix phx.gen.json Account Group groups name:string
对于users_groups,我创建了一个没有phx.gen
迁移:
create table(:users_groups) do
add :user_id, references(:users)
add :group_id, references(:groups)
timestamps()
end
# indexes here
架构:
schema "users_groups" do
belongs_to :user, MyApp.Accounts.User
belongs_to :group, MyApp.Accounts.Group
timestamps()
end
我添加了与用户和组架构的many-to-many
关系,然后我将它们播种为:
Repo.insert!(UsersGroups.changeset(
%UsersGroups{}, %{
user_id: 1,
group_id: 2
}
))
效果很好;协会进入,我可以看到我的多对多关系。
但是,如果我用这样的东西创建链接表:
mix phx.gen.json Accounts UserGroup users_groups user_id:references:users group_id:references:groups
...并尝试相同的播种方法,我看到了:
%MyApp.Accounts.UserGroup{__meta__: #Ecto.Schema.Metadata<:loaded, "users_groups">,
id: 1, inserted_at: ~N[2017-10-07 19:36:34.095408],
group: #Ecto.Association.NotLoaded<association :group is not loaded>,
group_id: nil, updated_at: ~N[2017-10-07 19:36:34.095411],
user: #Ecto.Association.NotLoaded<association :user is not loaded>,
user_id: nil},
发生了什么,以及如何为这个新实体提供支持?
答案 0 :(得分:1)
默认情况下,生成的变更集功能不包含cast
调用 1 2 3 中的关联,这意味着它们是被changeset函数忽略。您需要自己将这些列添加到cast
调用。
在lib/my_app/accounts/user_group.ex
中,更改:
def changeset(%UserGroup{} = user_group, attrs) do
user_group
|> cast(attrs, [])
|> validate_required([])
end
为:
def changeset(%UserGroup{} = user_group, attrs) do
user_group
|> cast(attrs, [:group_id, :user_id])
|> validate_required([:group_id, :user_id])
end
现在应该可以使用种子功能。