Ecto更新关联has_one belongs_to

时间:2017-06-13 14:03:37

标签: ecto

我必须让它变得过于复杂,但我很难绕过一个简单的问题。

假设我有两个表,global_userslocal_users

create table(:global_users, primary_key: false) do
  add :id, :integer, primary_key: true
  add :local_user_id, references(:local_users)
  ...
end

create table(:local_users, primary_key: false) do
  add :id, :integer, primary_key: true
  add :global_user_id, references(:global_users)
  ...
end

@primary_key {:id, :integer, autogenerate: false}
schema "global_users" do
  has_one :local_user, Local.User
  ...
end

@primary_key {:id, :integer, autogenerate: false}
schema "local_users" do
  belongs_to :global_user, Global.User
  ...
end

以编程方式,我将首先创建一个global_user,然后创建一个local_user,然后我需要将两者关联起来。

例如,如果现有的,有效的global_user和现有的有效local_user,我如何将现有的local_user与现有的global_user相关联?

添加has_one后,我无法再访问外键(例如,没有%Global.User{:local_user_id}要更新,只有关联!)。

同样,我知道这似乎很简单,我确信我只是遗漏了一些明显的东西。

提前致谢!

1 个答案:

答案 0 :(得分:0)

好吧,看起来我在考虑错误。当你有一个has_one时,它实际上只是一个可能会在以后为你保存连接的引用。

e.g。 local_user_id表格中没有global_user,但您可以查询它:

Repo.all from u in Global.User, preload: [:local_user]

然后根据您定义has_one

的方式获取匹配项
has_one :local_user, Local.User, foreign_key: :global_user_id

现在有道理。

当然,如果你想限制返回的字段,你仍然需要变得复杂......