gpt4 book ai didi

elixir - 在没有预加载的情况下检索 Ecto 关系的 ID

转载 作者:行者123 更新时间:2023-12-02 05:20:24 25 4
gpt4 key购买 nike

假设我有两个 Ecto 模型(及其迁移):

schema "projects" do
field :name, :string

belongs_to :client, MyApp.Client

timestamps
end

create table(:projects) do
add :name, :string
add :client_id, references(:clients)

timestamps
end

schema "clients" do
field :name, :string

has_many :projects, MyApp.Project

timestamps
end

create table(:clients) do
add :name, :string

timestamps
end

如果我查询了项目模型,例如。

project = Repo.get!(Project, proj.id)

正如预期的那样,我无法访问 project.client.id,因为我没有在查询中使用预加载

每当我尝试访问 project.client_id 时,它都会返回 nil。我当然应该能够访问外键 id 本身吗?

希望下面的代码能够更好地说明:

client = Repo.insert!(%Client{name: "Test Client"})
proj = Repo.insert!(%Project{name: "Test Project 1", client: client})

project = Repo.get!(Project, proj.id)
assert project.client_id != nil
# ^ This always fails because project.client_id is nil

最佳答案

这里的问题是您构建 proj 的方式导致 client_id 字段永远不会被填充。您可以通过检查数据库来验证这一点。

您可以使用Ecto.Model.build/3从客户端创建项目:

proj = build(client, :projects, %{name: "Test Project 1"}) |> Repo.insert!

关于elixir - 在没有预加载的情况下检索 Ecto 关系的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32843572/

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