与phx.gen.json进行播种协会

时间:2017-10-07 20:40:34

标签: elixir phoenix-framework ecto seeding

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

发生了什么,以及如何为这个新实体提供支持?

1 个答案:

答案 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

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