与 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
种子功能现在应该可以使用了。
使用 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
种子功能现在应该可以使用了。