更高级:与长生不老药苦艾酒相关联
More advanced :assoc with elixir absinthe
我的博客应用有一个 Post
模型,其中有很多 Comment
个。
schema "post" do
field :title, :string
field :content, :string
belongs_to :owner, MyApp.Accounts.User, foreign_key: :owner_id
has_many :comments, MyApp.Content.Comment, foreign_key: :post_id
timestamps()
end
我也有一个相关的苦艾酒对象。
object :post do
field :id, :integer
field :title, :string
field :content, :string
field :owner, :user, resolve: assoc(:owner)
field :comments, list_of(:comment), resolve: assoc(:comments)
end
查询按预期工作。
现在我想向 Comments
模式添加一个布尔值 active
字段,以便我可以执行软删除;我只会 select 评论 active == true
,我会通过将 active
设置为 false
来删除评论。
我将字段添加到我的架构中:
field :active, :boolean, default: true, null: false
现在我只想要苦艾酒 :comments
字段来 return 活跃评论。我有一个自定义解析器...
field :comments, list_of(:comment), resolve: fn (query,_,resolution) ->
query =
from c in MyApp.Content.Comment,
where: c.post_id == ^query.id,
where: c.active == true,
select: c
{:ok, MyApp.Repo.all(query)}
end
我担心这会 运行 变成 N+1 问题。有没有更优雅的方法来做到这一点?
你需要在这里使用Batch Resolver
。 documentation 详细解释了一切。您的查询应如下所示:
query =
from c in MyApp.Content.Comment,
where: c.post_id in ^post_ids,
where: c.active == true,
select: c
{:ok, query |> MyApp.Repo.all() |> Enum.group_by(& &1.post_id)}
我的博客应用有一个 Post
模型,其中有很多 Comment
个。
schema "post" do
field :title, :string
field :content, :string
belongs_to :owner, MyApp.Accounts.User, foreign_key: :owner_id
has_many :comments, MyApp.Content.Comment, foreign_key: :post_id
timestamps()
end
我也有一个相关的苦艾酒对象。
object :post do
field :id, :integer
field :title, :string
field :content, :string
field :owner, :user, resolve: assoc(:owner)
field :comments, list_of(:comment), resolve: assoc(:comments)
end
查询按预期工作。
现在我想向 Comments
模式添加一个布尔值 active
字段,以便我可以执行软删除;我只会 select 评论 active == true
,我会通过将 active
设置为 false
来删除评论。
我将字段添加到我的架构中:
field :active, :boolean, default: true, null: false
现在我只想要苦艾酒 :comments
字段来 return 活跃评论。我有一个自定义解析器...
field :comments, list_of(:comment), resolve: fn (query,_,resolution) ->
query =
from c in MyApp.Content.Comment,
where: c.post_id == ^query.id,
where: c.active == true,
select: c
{:ok, MyApp.Repo.all(query)}
end
我担心这会 运行 变成 N+1 问题。有没有更优雅的方法来做到这一点?
你需要在这里使用Batch Resolver
。 documentation 详细解释了一切。您的查询应如下所示:
query =
from c in MyApp.Content.Comment,
where: c.post_id in ^post_ids,
where: c.active == true,
select: c
{:ok, query |> MyApp.Repo.all() |> Enum.group_by(& &1.post_id)}