Elixir 菲尼克斯/埃克托:列出所有帖子,包括3条最新评论’;标题

Elixir 菲尼克斯/埃克托:列出所有帖子,包括3条最新评论’;标题,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有一个帖子模式,有很多评论。我想在一个页面上列出所有带有注释的帖子(我将单独使用分页),使用单个db查询,但有以下限制: 第一:我想将预加载限制为每篇文章3条最新评论(不是全部,因为可能有数百条) 第二:我只想从评论中预装标题栏,避免“文本”栏,因为文本可能包含太多内容 我的最终结果是: Post 1 ──┬── Comment 1 Title │── Comment 2 Title └── Comment 3 Title Post 2 ──┬── Com

我有一个帖子模式,有很多评论。我想在一个页面上列出所有带有注释的帖子(我将单独使用分页),使用单个db查询,但有以下限制:

第一:我想将预加载限制为每篇文章3条最新评论(不是全部,因为可能有数百条)

第二:我只想从评论中预装标题栏,避免“文本”栏,因为文本可能包含太多内容

我的最终结果是:

Post 1 ──┬── Comment 1 Title
         │── Comment 2 Title
         └── Comment 3 Title

Post 2 ──┬── Comment 1 Title
         │── Comment 2 Title
         └── Comment 3 Title

Post 3 ──┬── Comment 1 Title
         │── Comment 2 Title
         └── Comment 3 Title
…(等)

无论我尝试了什么组合,我都无法限制每篇文章的嵌套评论数(我的限制总是限制评论总数,而不是每篇文章)。 此外,我的选择无法仅从注释加载标题。如果有经验的人有任何意见,我们将不胜感激

PS:上面已经提出了,但为了进一步澄清,这里是我的模型:

  schema "posts" do
    field :title, :string
    field :slug, :string
    field :active, :boolean, default: true
    has_many :comments, App.Comment
    timestamps()
  end

  schema "comments" do
    field :title, :string
    field :body, :string
    field :email, :string
    field :meta, :map
    field :active, :boolean, default: false
    belongs_to :post, App.Post
    timestamps()
  end
PPS:更具体地说,我想知道是否有可能以嵌套预加载的方式设置嵌套限制:

query = from Post, preload: [:file, :image, {:comments, [:user, :icon]}], limit: [10, {:comments: 3}]

该预加载将预加载注释中的嵌套用户和图标列,但limit显然不适用于嵌套记录。

未对此进行测试,但我认为预加载时可以使用查询。不过,我对语法有点不确定

query = from Post, preload: [:file, :image, {:comments, from(c in Comment, limit: 10), [:user, :icon]}], limit: 10
看看这里的第三个例子。

由于我没有时间实际检查代码,所以您可以使用一个“伪”版本来执行此操作,但它会帮助您开始

有其他选择,所以在这种情况下如何去做取决于你

首先创建一个视图,如下所示:

 create view posts_with_last_comments as
   select
     p.*,
     (select array_agg(title) from comments where post_id = p.id order by inserted_at limit 3) as last_titles
   from
     posts p
然后在应用程序中执行以下操作:

query = from p in "posts_with_comments"
posts = MyApp.Repo.all(query)

请注意,我尝试使用postgresql语法,这可能会对其他数据库有所改变。

我可能会为此创建一个数据库视图,并为其创建一个EXTO模式,然后简单地使用它。我也在考虑尝试原始查询,但希望看到本机EXTO方式。谢谢@JustinWood,似乎我被卡住了:)你可以遍历所有的帖子,为每个帖子做一个特定的预加载。不过,这是一个N+1查询,这是不幸的;然而“:comments,from(Comment中的c,limit:3)”将帖子数量限制为3,而不是评论。也许是个bug?谢谢,这似乎是唯一明智的方法。我想,如果有大量的连接和联合,这也是可能的,但我就是不能把我的心思放在它上面。一路博士后。:)@恩,是的,有很多选择,但这一个似乎是明确和简单的,因为他们来到我,所以我更喜欢这一个,我想