Ecto更新关联has_one belongs_to
问题描述:
我必须让它过于复杂,但我很难将我的头围绕一个简单的问题。Ecto更新关联has_one belongs_to
说我有两个表,global_users
和local_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
现在有道理。
当然,如果你想限制返回的字段,你仍然必须变得复杂...