5

問題

私はfilesテーブルを持っていますが、1 対 1 の関連付けを作成する他の多くのテーブルusersavatarありpostsますphoto

可能な解決策

考えられる解決策は、テーブルを作成users_filesposts_filesて使用することhas_one :throughです。しかし、これは過剰に見えます。

理想的なソリューション

理想的な解決策は、このようなテーブルを定義することです

users
 - avatar_id

posts
 - photo_id

with:パラメータが含まれてhas_oneいるため、スキーマは次のようになります

schema "users" do
    has_one :avatar, MyApp.FileDb, with: :avatar_id, foreign_key: :id #id is default

end

schema "posts" do
    has_one :photo, MyApp.FileDb, with: :photo_id, foreign_key: :id

end

そうすれば、belongs_toonを定義する必要はありませんfiles。同様のメカニズムはすでにありますか?フェニックスでこれに対処する標準的な方法は何ですか?

4

2 に答える 2

10

外部キーが定義されているため、belongs_to を持たないことから逃れることはできません。2 つの選択肢があります。

  1. ユーザーと投稿の両方がファイル テーブルを指す avatar_id と photo_id を持つように関係を反転します。

  2. 「files」テーブルなしで「users_files」テーブルと「posts_files」テーブルの両方を定義します。"users_files" と "posts_files" は、Ecto のモデル レベルで共有できる完全なテーブル構造を持ちます。このケースについては、実際に Ecto ドキュメントで説明しています: http://hexdocs.pm/ecto/Ecto.Schema.html#belongs_to/3 (ポリモーフィック セクションを参照)

于 2015-09-19T16:23:51.047 に答える