Я создаю приложение для чатов, где две основные модели: 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
и заменить его на простое целое поле, но тогда я не хочу потерять преимущества проверки внешнего ключа на уровне БД.
Как решить эту проблему?
Почему вы/ваш коллега хотите удалить это? Совершенно прекрасно иметь несколько взаимосвязей между двумя моделями в РСУБД. – Dogbert
Вы можете позволить ему быть двумя отдельными отношениями, если они означают две разные вещи. Вы также можете добавить некоторые метаданные в таблицу 'rooms_users', такую как логический' creator' или какой-то уровень 'role', содержащий« creator/admin »или что-то в этом роде. – Frost
@ Dogbert Хорошо, спасибо. Он сказал, что это не правильный способ сделать это. Может быть, у него тоже есть путаница. В любом случае, я просто хотел проверить, был ли этот подход нормальным. – dotslash