2017-06-13 124 views
0

我必須讓它過於複雜,但我很難將我的頭圍繞一個簡單的問題。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}更新,只有一個關聯!)。

同樣,我知道這看起來很簡單,而且我確信我只是錯過了一些明顯的東西。

在此先感謝!

回答

0

好吧,看起來我正在考慮錯誤。當您有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 

現在有道理。

當然,如果你想限制返回的字段,你仍然必須變得複雜...