2016-09-15 56 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在评论中指出的那样,在两个模式之间建立多重关系是完全正确的。

相关问题