18

https://github.com/elixir-lang/ecto/issues/389とそこからリンクされている関連する問題を読んでみると、Ecto はポリモーフィック アソシエーションをサポートしているようです。

Task モデルと Event モデルに Comment モデルの関連付けが必要だとします。Ecto とカスタム ソースの関連付けに関する私の理解が正しければ、4 つのテーブルと 3 つのモデルが必要になります。

テーブル

  • タスク
  • イベント
  • タスク_コメント
  • イベントコメント

モデル

  • 仕事
  • イベント
  • コメント

タスクおよびイベント モデルには、以下のようにカスタム ソースとの has_many 関連付けがあります。

defmodule ExampleApp.Task do
  use ExampleApp.Web, :model

  schema "tasks" do
    field :title, :string
    field :body, :string
    has_many :comments, {"tasks_comments", Comment}

    timestamps
  end
end

defmodule ExampleApp.Event do
  use ExampleApp.Web, :model

  schema "events" do
    field :title, :string
    field :body, :string
    has_many :comments, {"events_comments", Comment}

    timestamps
  end
end

私が理解していないのは、コメントモデルがどのように見えるべきかということです?

Comment モデルは 2 つのテーブルをどのように処理しますか? そして、異なるモデルへの属しへの関連付けをどのように処理しますか?

4

1 に答える 1

20

上記の設計を使用する場合、コメント モデルには実際にはテーブルがなく、そのテーブルは関連付けによって定義されます。したがって、すべてのイベントのすべてのコメントを取得するには、次のようにします。

from c in {"events_comments", Comment}

これは、場合によっては優れた手法であり、ストレージ (テーブル) をモデルと結合しないようにすることができます。異なるテーブルに同じモデルを使用できます。

ただし、すべてのコメントを取得してイベントとタスクの両方に関連付ける場合は、スルー リレーションシップを使用できます。"events" <-> "events_comments" <-> "comments" と "tasks" <-> "tasks_comments" <-> "comments" があります。

もう 1 つのアプローチは、Rails の方法でポリモーフィックな関連付けを行い、Comment モデルで「kind」列を定義することです。データベース参照が壊れますが、これは別の方法です。

この問題について Ecto ドキュメントを改善します。フィードバックに感謝します!

于 2015-05-16T07:43:23.810 に答える