带有Ecto

时间:2017-10-12 22:13:51

标签: elixir phoenix-framework ecto

使用Ecto v2.2.6,Phoenix 1.3

我有一个带有新闻源的博客应用。它的工作原理如下:

  • 用户可以提交帖子。
  • 用户可以关注其他用户。
  • 当用户提交帖子时,会添加新闻源表格中的项目。
  • 用户可以看到他们关注的用户提交的帖子的新闻源。

我想使用Ecto.Query从给定用户关注的用户那里获取新闻源项目列表。

快速背景。以下是对象:

用户

mix phx.gen.json Accounts User users email:string password:string

发布

mix phx.gen.json Content Post posts title:string content:string user_id:references:users

userspostshas_many:belongs_to:的关系。)

按照

mix phx.gen.json Accounts Follow follows following_id:references:users followed_id:references:users

(当用户A跟随用户B时,会创建一个新的Follow条目,其中following_id指向A,followed_id指向B。)

新闻源

mix phx.gen.json Content Newsfeeditem newsfeeditems type:string, user_id:integer, content:string

现在我想查询这些东西。要让我获得给定用户的Newsfeeditems列表,这很简单:

导入Ecto.Query

query =
  from n in Newsfeeditem,
    where: n.user_id == ^user_id

我们说我是用户1,我关注的是用户2,3和4. follows表中有三个条目。要为这些用户获取所有相应的newsfeeditems,查询将如下所示:

query =
  from n in Newsfeeditem,
    where: n.user1_id in [2,3,4]

我想让它充满活力。在这里,我迷失了。我想做一些类似于此的事情:

subquery =
  from f in Follow,
    where: f.following_id == 1,
    select: f.follower_id

query =
  from n in Newsfeeditem,
    where: n.user_id in (Repo.all(subquery))

显然这不起作用,但我不确定如何正确构建这些东西。

如何通过子查询选择此项? (注意我特意寻找子查询解决方案,但如果有更好的方法则可以获得奖励积分)

1 个答案:

答案 0 :(得分:2)

Subquerys are currently not allowed in where clauses; the documentation recommends using a JOIN instead.您的查询可以很容易地转换为JOIN。我还没有对它进行测试,但这应该可行:

noexcept