2015-05-16 86 views
17

當我通過https://github.com/elixir-lang/ecto/issues/389及其相關問題閱讀時,Ecto似乎支持多態關聯。多態協會如何與Ecto協同工作?

假設我需要關於任務和事件模型的評論模型關聯。如果我的自定義源外生協會的理解是正確的,那麼我們就需要四個表和三款車型,

  • 任務
  • 事件
  • tasks_comments
  • events_comments

型號

  • 任務
  • 事件
  • 評論

任務和事件模式將有如下的自定義源的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模型如何處理兩個表?以及它如何處理belongs_to與不同模型的關聯?

回答

17

如果你打算使用上面的設計,評論模型並沒有真正的表格,它的表格是由關聯定義的。因此,要獲得所有事件的所有意見,你可以這樣做:

from c in {"events_comments", Comment} 

這在某些情況下,一個偉大的技術,它可以讓你不耦合存儲器(表)與模型。您可以爲不同的表格使用相同的模型。

但是,如果您想獲取所有評論並將它們與事件和任務相關聯,則可以通過關係使用。你將有「事件」< - >「events_comments」< - >「評論」和「任務」< - >「tasks_comments」< - >「評論」。

另一種方法是使用Rails的多態關聯方式,並在Comment模型中定義一個「kind」列。它確實會破壞數據庫引用,但它是解決此問題的另一種方法。

我會在這個問題上改進Ecto文檔,感謝您的反饋!

+0

何塞,謝謝你的回答。您的答案有多個問題。也許這是微不足道的。 1.「評論模型沒有任何表格」=>評論模型如何在沒有模式的情況下工作。我正在閱讀'schema == table'。我如何驗證評論沒有架構,從而沒有更改集? 2.'軌道'如何在Ecto協會工作?有沒有任何示例代碼?我沒有看到閱讀源代碼或支持此文檔的文檔。 – shankardevy

+1

1。評論模型沒有表格,但通過關聯構建時有一個表格。所以祕密是使用'assoc(task,:comments)'而不是'%Comment {}'。我在這裏記錄了這些:https://github.com/elixir-lang/ecto/commit/1d98ad795b8707ff8a9496657112603c14a64cc2 –

+1

2.導軌方式在Ecto關聯中不起作用,因爲它通常是不好的做法,因爲數據庫無法保留其引用。你將不得不建立你的查詢並手動設置適當的字段。 –