2016-09-15 2 views
0

Я создаю приложение для чатов, где две основные модели: 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 и заменить его на простое целое поле, но тогда я не хочу потерять преимущества проверки внешнего ключа на уровне БД.

Как решить эту проблему?

+1

Почему вы/ваш коллега хотите удалить это? Совершенно прекрасно иметь несколько взаимосвязей между двумя моделями в РСУБД. – Dogbert

+1

Вы можете позволить ему быть двумя отдельными отношениями, если они означают две разные вещи. Вы также можете добавить некоторые метаданные в таблицу 'rooms_users', такую ​​как логический' creator' или какой-то уровень 'role', содержащий« creator/admin »или что-то в этом роде. – Frost

+0

@ Dogbert Хорошо, спасибо. Он сказал, что это не правильный способ сделать это. Может быть, у него тоже есть путаница. В любом случае, я просто хотел проверить, был ли этот подход нормальным. – dotslash

ответ

0

Как указано @Dogbert в комментариях, совершенно нормально иметь несколько взаимосвязей между двумя схемами.