2016-06-24 11 views
2

私は、次のスキーマを持つユーザー・プロファイル・モデルを持っている:エクト:外部キー

schema "user_profiles" do 
    field :birthday, Ecto.Date 
    field :gender, :string 
    field :first_name, :string 
    field :last_name, :string 
    field :description, :string 
    field :username, :string 

    # Associations 
    belongs_to :user, User 

    timestamps 
    end 

私も次のスキーマを持つ場所のモデルを持っている:

schema "locations" do 
    field :name, :string 
    field :admin_1, :string 
    field :admin_2, :string 
    field :country, :string 
    field :country_abbreviation, :string 
    field :code, :string 
    field :latitude, :decimal 
    field :longitude, :decimal 

    timestamps 
    end 

場所は都市でありますフランスのパリのように。多くのユーザープロファイルを同じ場所に関連付けることができます。しかし、場所は、ユーザープロファイルが存在することを実際に意識する必要はありません。

ユーザープロファイルスキーマに場所の関連付けを追加します。私は関係が1対1ではないので、ユーザーhas_oneにしたくありません。私は、ロケーション・スキーマ上の関連付けをユーザー・プロファイルにも追加したくありません。

私はEctoのドキュメントを見てきましたが、私はこの関連を表現する方法を失っています。

私は、次のページに相談している:私はおそらく基本的な何かをしないのですが、私はこの質問をする前に、いくつかのことよりも多くを試した https://hexdocs.pm/ecto/Ecto.Schema.html

を。

+0

many_to_manyという関連付けをしたいような音がします。つまり、ユーザーは多数の場所を持つことができ、場所は多くのユーザーに帰属できます。これは、典型的には、例えば、呼び出されるジョインテーブルを介して行われる。 'location_profiles'です。ここでは、より詳細に行くリンクです:[リンク](http://learningwithjb.com/posts/many-to-many-relationship) –

+0

@ハリソンルーカスコメントをいただきありがとうございます。私は実際には、ユーザープロファイルごとに1つの場所を持つだけです。また、1つの場所は多くのユーザープロファイルに属します。データベースでは、ロケーションはユーザープロファイルテーブルの外部キーに過ぎません。 – michaels

+0

ああ、その場合、なぜHas_manyとbelongs_toをしないのですか?例えば。 Profileaはlocationaに属し、Profilebはlocationaに属します。 したがって、location has_many profiles、およびプロファイルは単一の場所に属していますか? –

答えて

2

1つの解決策は、プロファイルが関係に属する2つのモデル間の単純なhas_manyとbelongs_to関係を行うことです。

この関係は、1つのロケーションに複数のプロファイルを関連付けることができますが、1つのプロファイルには1つのロケーションしか持たないことを意味します。

など。

作品:

というプロファイル:ロンドン√

プロファイル2:ロンドン√

間違っ:

というプロファイル:ロンドンX

というプロファイル:フランスX

これを実行する方法です。

あなたが持っているでしょう、あなたの profile_table移行に続いて
#web/models/location.ex 
schema "location" do 
    has_many :profiles, MyApp.Profile 
end 

#web/models/profile.ex 
schema "profile" do 
    belongs_to :location, MyApp.Location 
end 

追加:location_idの、参照(:場所)

あなたは場所のモデルに外部キーを必要としません、プロファイルモデルのみ。

+0

ありがとう!これは完全に機能しました! – michaels