【发布时间】:2018-06-02 01:28:43
【问题描述】:
我正在使用苦艾酒和长生不老药(凤凰 1.3)。我有一个博客应用程序,其中包含用户、帖子和喜欢,并且喜欢通过用户和帖子之间的多对多关系连接。
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
假设我想在后端而不是前端聚合它们。我希望:liked_by 只是对所有存在的喜欢的计数,更像是field :likes, :int,这样我就可以得到这样的回复:
{
"data": {
"post" : {
"title" : "Title",
"content" : "This is the content",
"likes" : 7
}
}
}
我的对象应该是什么样子?我想做这样的事情:
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
编辑 #1: 更具体地说,我想知道如何在苦艾酒对象中参数化匿名函数。我可以很容易地让对象返回一个非参数化的值:
field :somenumber, :integer, resolve: fn (_,_) -> {:ok, 15} end
但是像这样添加一个参数
field :somenumber, :integer, resolve: fn (foo,_) -> {:ok, foo} end
返回以下内容:
...
"somenumber": {},
...
如何传入对象的 id 或隐式关联的查询?
编辑#2:我已经找到了解决方案,但感觉很hacky。
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
【问题讨论】:
-
field :likes, :integer, resolve: &Post.get_likes/3使用自定义Post.get_likes/3实现应该可以。详情请见Absinthe.Schema.Notation.resolve。 -
@mudasobwa 越来越近,请参阅上面的编辑
-
您不需要使用 assoc,只需在其中放置一个返回整数的函数即可。此外, assoc 也应该可以工作。你有什么错误还是什么?
-
您查看我提供的链接了吗?我现在没有能力检查它,但你可以试试 arity 3 和 IO.inspect 的乐趣。
-
@mudasobwa 我找到了一个 hacky 解决方案,请参阅编辑 #2。
标签: elixir phoenix-framework graphql absinthe