2016-09-15 2 views
0

두 개의 기본 모델이 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

왜 당신/당신 동료가 그걸 제거하고 싶습니까? RDBMS에서 2 개의 모델 사이에 여러 개의 관계가있는 것은 완벽합니다. – Dogbert

+1

두 가지 다른 것을 의미하는 경우 두 가지 분리 된 관계로 만들 수 있습니다. 'createdator/boolean '과 같은 "rooms_users"테이블이나 "creator/admin"같은 것을 포함하는 어떤 종류의'role' 레벨과 같은 메타 데이터를 추가 할 수도 있습니다. – Frost

+0

@ 도그 버트 오케이, 고마워. 그는 그것을하는 것이 옳은 방법이 아니라고 말했습니다. 어쩌면 그는 너무 혼란 스러울지도 모른다. 어쨌든이 접근 방식이 제정신인지 확인하고 싶었습니다. – dotslash

답변

0

주석에서 @Dogbert가 지적한대로 두 스키마간에 여러 관계를 갖는 것이 완벽합니다.