2016-09-15 3 views
0

Ich baue eine Chat-Room-Anwendung, wo die beiden primären Modelle User und Room sind. Ein Benutzer kann nun neue Räume erstellen und zu vorhandenen Räumen gehören. So landete ich für Zimmer mit folgendem Modell:Können zwei Modelle zwei Arten von Beziehungen durch zwei Felder haben?

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 

Meine Verwirrung ist, es sieht nun gibt es zwei Arten von Beziehungen zwischen User und Room: Viele zu eins, und viele, viele. Ein Kollege schlug vor, das Feld belongs_to zu entfernen und durch ein einfaches Integer-Feld zu ersetzen, aber dann möchte ich nicht die Vorteile der Fremdschlüsselprüfung auf DB-Ebene verlieren.

Wie kann diese Situation gelöst werden?

+1

Warum möchten Sie/Ihr Kollege das entfernen? Es ist vollkommen in Ordnung, mehrere Beziehungen zwischen zwei Modellen in einem RDBMS zu haben. – Dogbert

+1

Sie könnten zwei getrennte Beziehungen haben, wenn sie zwei verschiedene Dinge bedeuten. Sie könnten auch einige Metadaten zur 'rooms_users' Tabelle hinzufügen, wie zum Beispiel eine' creator'-Boole'sche oder eine Art 'role' Ebene, die" creator/admin "oder etwas ähnliches enthält. – Frost

+0

@Dogbert Okay, danke. Er sagte, das sei nicht der richtige Weg. Vielleicht hat auch er etwas Verwirrung. Wie auch immer, ich wollte nur überprüfen, ob dieser Ansatz vernünftig ist. – dotslash

Antwort

0

Wie von @Dogbert in den Kommentaren hingewiesen, ist es völlig in Ordnung, mehrere Beziehungen zwischen zwei Schemas zu haben.