2016-09-15 63 views
0

我正在構建一個聊天室應用程序,其中兩個主要模型是UserRoom。現在,用戶可以創建新房間以及屬於現有房間。所以我結束了以下模型的房間:兩個模型可以通過兩個字段有兩種關係嗎?

defmodule Elemental.TxChat.Room do 
    use Elemental.TxChat.Web, :model 

    schema "rooms" do 
    field :name, :string 
    field :created_at, Ecto.DateTime 

    # Foreign key indicating which user created this room 
    # One user can create any number of rooms 
    belongs_to :created_by, Elemental.TxChat.User 
    field :created_from_app, :integer 

    many_to_many :members, Elemental.TxChat.User, join_through: "rooms_users" 

    timestamps() 
    end 

    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:name, :created_at, :created_by, :created_from_app]) 
    |> validate_required([:name, :created_at, :created_by, :created_from_app]) 
    end 
end 

我的困惑是,現在看起來有兩種關係UserRoom之間:多對一和多對多。一位同事建議我刪除belongs_to字段並用一個簡單的整數字段替換它,但我不想失去在數據庫級別檢查外鍵的好處。

這種情況如何解決?

+1

爲什麼你/你的同事想要刪除它?在RDBMS中的兩個模型之間建立多重關係是非常好的。 – Dogbert

+1

如果它們是兩個不同的東西,你可以讓它成爲兩個單獨的關係。你也可以在'rooms_users'表中添加一些元數據,比如'creator'布爾值,或者一些'role'級別,包含「creator/admin」或類似的東西。 – Frost

+0

@Dogbert好的,謝謝。他說這不是正確的做法。也許他也有一些困惑。無論如何,我只是想檢查這種方法是否理智。 – dotslash

回答

0

正如@Dogbert在評論中指出的那樣,在兩個模式之間建立多重關係是完全正確的。

相關問題