与 phx.gen.json 建立的播种协会

Seeding associations made with phx.gen.json

使用 Ecto v2.2.6,Phoenix 1.3

我正在尝试为使用 phx.gen.json 创建的链接 table 播种。

首先,一个简单的链接table。我创建了一个用户模型、一个组模型和一个链接 table,通过多对多关系将它们连接起来。

初级 tables:

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
  }
))

效果很好;关联进去,我可以看到我的多对多关系。

但是,如果我用这样的东西创建链接 table:

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},

发生了什么,我必须做什么才能播种这个新实体?

默认情况下,生成的变更集函数在 cast 调用 1 2 3 中不包含关联,这意味着它们会被变更集函数忽略.您需要自己将这些列添加到 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

种子功能现在应该可以使用了。