私はエリキシル(フェニックス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
カスタム '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
@mudasobwa近づく、上記の編集を参照してください –
あなたはassocを使う必要はありません。そこに整数を返す関数を置くだけです。また、assocも同様に機能するはずです。あなたは何かエラーや何かを得ますか? – mudasobwa