我正在构建一个聊天室应用程序,其中两个主要模型是User
和Room
。现在,用户可以创建新房间,也可以创建属于现有房间的房间。因此,我最终为房间设计了以下模型:
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
我的困惑是,现在看起来User
和Room
之间有两种关系:多对一和多对多。一位同事建议我删除belongs_to
字段并用一个简单的整数字段替换它,但是我不想失去在DB级别进行外键检查的好处。
如何解决这种情况?
正如@Dogbert在评论中指出的那样,在两个模式之间有多个关系是完全可以的。