gpt4 book ai didi

elixir - 嵌套子项上的 Ecto 祖 parent 键

转载 作者:行者123 更新时间:2023-12-04 20:48:36 24 4
gpt4 key购买 nike

一个组织有很多用户

schema "organizations" do
field :name, :string
has_many :users, TestApp.User
end

一个用户有很多下属

schema "users" do
field :name, :string
belongs_to :organization, TestApp.Organization
belongs_to :manager, TestApp.User,
foreign_key: :manager_id
has_many :subordinates, TestApp.User,
foreign_key: :manager_id
end

如何确保下属在按以下方式创建时具有 organization_id 值?

  test "create Org and User and Subordinate in one step" do
subordinate =
%User{}
|> User.changeset(%{name: "A Subordinate"})

manager =
%User{}
|> User.changeset(%{name: "A Manager"})
|> Changeset.put_assoc(:subordinates, [subordinate])

organization =
%Organization{}
|> Organization.changeset(%{name: "An Organization"})
|> Changeset.put_assoc(:users, [manager])

%{users: [ %{subordinates: [subordinate]} = manager]} = organization = Repo.insert!(organization)

# Passes
assert manager.organization_id == organization.id
# Fails
assert subordinate.organization_id == organization.id
end

最佳答案

选项 1
调用 Repo.insert!分别在每个变更集上

subordinate =
%User{}
|> User.changeset(%{name: "A Subordinate"})
|> Repo.insert!

manager =
%User{}
|> User.changeset(%{name: "A Manager"})
|> Changeset.put_assoc(:subordinates, [subordinate])
|> Repo.insert!

创建返回与其下属合并的经理列表的辅助函数

defp managers_with_subordinates(managers) do
Enum.reduce(managers, [], &(&2 ++ [&1] ++ &1.subordinates))
end

然后将结果传递给put_assoc

users = managers_with_subordinates([manager])

organization =
%Organization{}
|> Organization.changeset(%{name: "An Organization"})
|> Changeset.put_assoc(:users, users)

并将您的模式匹配更改为

%{users: [user1, user2]} = organization = %Organization{} |> Organization.changeset |> put_assoc(:users, x) |> Repo.insert!

assert user1.organization_id == organization.id
assert user2.organization_id == organization.id
assert user2.manager_id == user1.id

选项 2

subordinate =
%User{}
|> User.changeset(%{name: "A Subordinate"})
|> prepare_changes( fn(changeset) ->
manager = changeset.repo.get(User, changeset.changes.manager_id)
changeset |> cast(%{organization_id: manager.organization_id}, [:organization_id])
)

关于elixir - 嵌套子项上的 Ecto 祖 parent 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39542961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com