Ecto更新关联has_one belongs_to

问题描述:

我必须让它过于复杂,但我很难将我的头围绕一个简单的问题。Ecto更新关联has_one belongs_to

说我有两个表,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}更新,只有一个关联!)。

同样,我知道这看起来很简单,而且我确信我只是错过了一些明显的东西。

在此先感谢!

好吧,看起来我正在考虑错误。当您有has_one时,它实际上只是一个参考,可能会稍后为您节省加入时间。

例如有在global_user表中没有local_user_id,但你会查询它想:

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

然后它会匹配根据您如何定义has_one

has_one :local_user, Local.User, foreign_key: :global_user_id 

现在有道理。

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