两个模型可以通过两个字段有两种类型的关系吗?

时间:2016-09-15 09:04:46

标签: elixir phoenix-framework ecto

我正在构建一个聊天室应用程序,其中两个主要模型是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字段并将其替换为一个简单的整数字段,但我不想失去在DB级别进行外键检查的好处。

如何解决这种情况?

1 个答案:

答案 0 :(得分:0)

正如@Dogbert在评论中指出的那样,在两个模式之间建立多个关系是完全可以的。