2015-10-23 10 views
11

のは、私は2つのモデル、PostCommentを持っているとコメントモデルがcomments表の列typeによって定義される2種類、normalfancyのうち、1することができましょう。エクト協会

Postモデルに2つの関連付けを追加したいと思います.1つはファンシーコメント、もう1つはノーマルコメントです。どうすればいいですか?これは、エクトでは利用できません

has_many :fancy_comments, MyApp.Comment, where: [type: 0] 
has_many :normal_comments, MyApp.Comment, where: [type: 1] 

答えて

13

this GitHub issueにそれについて長い議論がある。だから私はこのような何かをしたいです。

あなたはこのために構成可能なクエリを使用することができます

defmodule MyApp.Comment do 

    ...schema, etc. 

    def fancy(query) do 
    from c in query, 
     where: type == 0 
    end 

    def normal(query) do 
    from c in query, 
     where: type == 1 
    end  
end 

あなたはその後、それに基づいてhas_many :comments, MyApp.Commentとクエリを使用することができます。ここでは

assoc(post, :comments) |> Comment.fancy() |> Repo.all() 

composable queriesに関するブログ記事です。

また、クエリでプリロードを使用することができます。実装される予定だ場合

fancy_query = from(c in Comments, where: type == 0) 
Repo.preload(post, comments: fancy_query) 
+0

は、あなたがそれを実装することができますかどうかを知るために発生しないと?正確には 'どこに'がありますが、一般的にはフィルタリングのために何か? – JustMichael

+0

https://github.com/elixir-lang/ecto/issues/659#issuecomment-121233468を実装することは可能ですが、それを実装する計画はないことを示唆しています。このディスカッションでは、私の最初の例のように、構成可能なクエリを使用してこれを実現する方向に進みます。 – Gazler

+0

ありがとうございます。ありがとうございました – JustMichael