Ecto - 如何通过特定查询获取“has_many”

Posted

技术标签:

【中文标题】Ecto - 如何通过特定查询获取“has_many”【英文标题】:Ecto - how to get `has_many` with specific query 【发布时间】:2016-09-21 16:00:20 【问题描述】:

我有一个带有 has_many 关联的 ecto 模型。我想在默认情况下用一些查询来定义这个关联。

喜欢

defmodule MyApp.User do
  use MyApp.Web, :model

  schema "users" do
    has_many :comments, MyApp.Comment
  end
end

我想获取不是 deleted 的 cmets(删除的是 MyApp.Comment 架构的布尔字段,它应该等于 false)。实现这一目标的方法是什么?

我的尝试#1

我试过了

has_many :comments, Ecto.Query.from(c in MyApp.Comment, where: v.deleted == false)

但我得到了

(ArgumentError) association queryable must be a schema or source, schema, got: #Ecto.Query

【问题讨论】:

我认为这是不可能的。 Ecto 没有像活动记录那样的范围概念。我可以建议的最接近的方法是在user.ex 中按照active_comments 的行创建一个函数。 【参考方案1】:

如果你有PostComment两个模型,你可以通过Ecto.Query然后Ecto.Repo找到未删除的cmets。

query = from c in Comment,
        where c.deleted == false,
        select: c

comments = MyApp.Repo.all(query) # This will give you all the non-deleted comments

此外,您可能希望在您的应用程序中使用以下查询。

alias MyApp.Post,Comment

query = from p in Post,
        join: c in assoc(p, :comments),
        where: c.deleted == false,
        select: p, c # for comments only - just select: c.

Blog.Repo.all(query)

【讨论】:

我知道,谢谢。但是如何在模式块中指定这种关联呢?这就是问题 哦!通常我在模型中创建一个方法,然后在控制器操作中使用它。这是清晰且易于撰写的。这会很有趣,但我从未见过有人做过这样的事情。

以上是关于Ecto - 如何通过特定查询获取“has_many”的主要内容,如果未能解决你的问题,请参考以下文章

使用动态运算符创建 Ecto 查询

如何在自定义混合任务中从 Ecto 获取数据

Ecto 子查询中的 SQL WITH AS 语句

Rails 多级 has_man 通过

如何使用 Ecto 加入多个存储库?

使用 ecto 查询连接 3 个表