2017-12-08 11 views
0

私のPhoenixアプリケーションでは、ContactテーブルとAddressテーブルがあります。接触スキーマは次のとおりです。Ecto単純な外部キー

schema "contacts" do 
    field :name, :string 
    field :number, :string 
    has_one :address, App.Address, on_delete: :nothing 

    timestamps() 
end 

アドレススキーマは、私はちょうど連絡先データベースから充填アドレスのドロップダウンを経由して選択することでaddress_idを持ちたい

schema "addresses" do 
    field :name, :string 
    field :lat, :decimal 
    field :lng, :decimal 

    timestamps() 
end 

です。しかし、フェニックスは、だから、しかし、私はアドレスが連絡先または多くの連絡先に所属したいが、私はアドレステーブルにcontact_idフィールドを望んでいない、アドレスにcontact_idフィールドを検索しようとしている

`App.Address.contact_id` in `where` does not exist in the schema in query: 

from a in App.Address, 
    where: a.contact_id == ^9435, 
    select: {a.contact_id, a} 

を返します。エクトー・アソシエーションでこれをどのように達成するのですか?

私は、各contact_idとaddress_idのエントリがペアになっている仲介テーブルでこれを行うことができますが、不要な複雑さと抽象度を追加すると考えているので避けたいと思います。

編集:ありがとう、私はちょうどポストの後にちょうど逆にそれを考える必要があることを理解した。アドレスとして多くの連絡先があり、連絡先には1つのアドレスがあると考えると、関係は意味をなさない。私はちょうどそれが必ずしも真実ではないときにアドレスが連絡先に属すると思って立ち往生した。

+0

"アドレス帳のcontact_idフィールドは必要ありません"レコードはどのようにデータベースに関連付けられますか? – Dogbert

+0

多くの連絡先が1つのアドレスを共有できます。しかし、各連絡先には1つのアドレスしかありません。 – albydarned

答えて

1

Contactは一つだけAddressを持つことができ、Addressが複数のContact秒にすることができ、address_idフィールドがcontactsの表にあります場合は、ContactContacthas_manybelongs_to関係を必要としています。通常の1対多の関連をだ

contact = Repo.get(Contact, 1234) |> Repo.preload([:address]) 
IO.inspect contact.address.name 
0

schema "contacts" do 
    belongs_to :address, App.Address 
    ... 
end 

schema "addresses" do 
    has_many :contact, App.Contact 
    ... 
end 

今、あなたは、このようなContactのアドレスを取得することができます。 has_oneの代わりにbelongs_toを使用する必要があります。外部キーが定義されています。あなたは、このような

add :address_id, references(:addresses, on_delete: :nothing)

として関連線を、持っている必要があります場合は、あなたのスキーマが関係

schema "contacts" do 
    belongs_to :address, App.Address 
end 

schema "addresses" do 
    has_many :contact, App.Contact 
end 

を持つべきであるあなたの接触の移行

hereそれらの間の違いについての詳細を読むことができますこれらの調整後にエラーが発生している可能性があります。コントローラ/クエリの別のエラーです。