2015-10-23 8 views
11

Diciamo che ho due modelli, Post e Comment e il modello di commento può essere 1 su 2 tipi, normal e fancy che è definita dalla colonna type nella tabella comments.associazione Ecto con una condizione

Ora voglio aggiungere 2 associazioni sul mio modello Post, dove si fa riferimento a commenti di fantasia e uno a quelli normali, come dovrei farlo? Allora voglio qualcosa di simile:

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

risposta

13

Questo non è disponibile in Ecto, v'è una lunga discussione su di esso su this GitHub issue.

Si potrebbe utilizzare una query componibile per questo:

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 

È quindi possibile utilizzare has_many :comments, MyApp.Comment e query basata su quella:

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

Ecco un post su composable queries.

È possibile anche utilizzare un precarico con una query:

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

Non vi capita di sapere se è possibile implementare e se è previsto da attuare? Non esattamente "dove" ma qualcosa per filtrare in generale? – JustMichael

+0

Sono sicuro che è possibile implementarlo - https://github.com/elixir-lang/ecto/issues/659#issuecomment-121233468 suggerirebbe che non ci sono piani per implementarlo. La discussione si muove verso l'uso di query componibili per ottenere questo come il mio primo esempio. – Gazler

+0

oh capisco. Grazie – JustMichael