2017-12-19 22 views
0

私はエリキシル(フェニックス1.3)でabsintheを使用しています。ユーザー、投稿、好きなブログアプリがあり、ユーザーと投稿の多対多の関係で参加しています。elixir graphqlに集約フィールドを追加する

schema "users" do 
    field :email, :string 
    field :handle, :string 
    many_to_many :liked_posts, MyApp.Content.Post, join_through: "likes" 
    end 

    schema "posts" do 
    field :title, :string 
    field :content, :string 
    many_to_many :liking_users, MyApp.Accounts.User, join_through: "likes" 
    end 

    schema "likes" do 
    belongs_to :user, MyApp.Accounts.User 
    belongs_to :post, MyApp.Content.Post 
    end 

私はそれらをフロントではなくバックエンドに集約したいとしましょう。

{ 
    "data": { 
    "post" : { 
     "title" : "Title", 
     "content" : "This is the content", 
     "likes" : 7 
    } 
    } 
} 

私のオブジェクトが見えるように持っているだろうか:私は:liked_byは、単に私がこのような応答を取り戻すことができるように、より多くのfield :likes, :intのように、存在するすべての同類のカウントになりたいですか?

object :post do 
    field :id, :integer 
    field :title, :string 
    field :content, :string 
    field :likes, :integer, resolve: assoc(:liking_users, fn query, id, _ -> 
     query |> from like in MyApp.Content.Like, where: like.post_id == ^id, select: count("*") 
    ) 
    end 

EDIT#1:私はこのような何かやりたい具体的を、私はアブサンオブジェクトに匿名関数をパラメータ化する方法を知りたいのです。私は簡単に非パラメータ化値を返すために、オブジェクトを取得することができます:私は渡すことができますどのように

... 
"somenumber": {}, 
... 

field :somenumber, :integer, resolve: fn (_,_) -> {:ok, 15} end 

をしかし、次のように

field :somenumber, :integer, resolve: fn (foo,_) -> {:ok, foo} end 

リターンのようなパラメータを追加しますオブジェクトのID、または暗黙的に関連付けられたクエリ?

EDIT#2:私はこれに対する解決策を見つけましたが、非常にハッキリです。

object :post do 
    field :id, :integer 
    field :title, :string 
    field :content, :string 
    field :likes, :integer, resolve: fn (query,_,_) -> 
     Post.getLikeCount(query.id) 
    end 
    end 

resolution、リゾルバのためのアリティ3無名関数の第三引数は、Absinthe.Resolutionオブジェクトです:

object :post do 
    field :id, :integer 
    field :title, :string 
    field :content, :string 
    field :likes, :integer, resolve: fn (_,_,resolution) -> 
     {:ok, Post.getLikeCount(resolution.source.id) } 
    end 
    end 
+1

カスタム 'Post.get_likes/3'実装で' field:likes、:integer、resolve:&Post.get_likes/3'を実行する必要があります。詳細については、['Absinthe.Schema.Notation.resolve'](https://hexdocs.pm/absinthe/Absinthe.Schema.Notation.html#resolve/1)を参照してください。 – mudasobwa

+0

@mudasobwa近づく、上記の編集を参照してください –

+1

あなたはassocを使う必要はありません。そこに整数を返す関数を置くだけです。また、assocも同様に機能するはずです。あなたは何かエラーや何かを得ますか? – mudasobwa

答えて

1

@のmudasobwaのアドバイスに従った後、私はこのソリューションを持っています。 resolution.sourceはタイプMyApp.Content.Postであり、そのうちidはそのポストを指します。

次に、私はちょうど好きの数を取得するgetLikeCount/1と呼ばれるPost.exに関数を追加しました。

def getLikeCount (post_id) do 
    query = 
     from l in MyApp.Content.Likes, 
     where: l.post_id == ^post_id, 
     select: count("*") 

    case Repo.one(query) do 
     nil -> {:error, "Error getting like count for post #{post_id}"} 
     likes -> {:ok, likes} 
    end 
    end 
+1

['Repo.one/2'](https://hexdocs.pm/ecto/Ecto.Repo.html#c:one/2)はおそらくもっと適しています。また、なぜ私はこの解決策がハッキーだと思いませんか?ところで、ドキュメントによると、リゾルバへの呼び出しの最初のパラメータは 'Post.id'でなければなりません。 – mudasobwa

+1

が更新されました。また、アリティ3関数の最初の変数には、私が探していたものが正確に含まれているように見えるので、これはもはやハッキリに感じられません。 –

関連する問題