【问题标题】:Dynamic prefix on nested Ecto preloads嵌套 Ecto 预加载的动态前缀
【发布时间】:2021-09-08 08:10:07
【问题描述】:

我们在 Ecto 中通过将 deleted_at 列设置为某个日期来使用软删除。

这就是我们的基本架构不是 "public" 的原因,因为默认情况下我们不想查询已删除的记录。
我们的架构只是一个视图,其中仅包含 deleted_at=NULL 的记录。

但是,出于报告目的,我们必须预加载也已删除的记录,我们这样做:

  @preload [
    tickets: {
      from(ticket in Ticket, prefix: "public"),
      [
        fees: {
          from(fee in Fee, prefix: "public"),
          [
            fee: from(fee1 in Fees.Fee, prefix: "public"),
            ticket: from(ticket1 in Ticket, prefix: "public")
          ]
        },
        taxes: from(tax in Tax, prefix: "public"),
        payments: {from(payment in Payment, prefix: "public"), [:refunds]}
      ]
    }
  ]

有没有办法以更简单、更简洁的方式从 "public" 架构中查询所有内容?

【问题讨论】:

  • 您是否尝试过在 Ecto Schema 模块中使用 @schema_prefix 属性,例如@schema_prefix :public
  • 我有@schema_prefix :filtered。这就是我的问题的重点。
  • 我明白了。您是否尝试过制作第二个模式模块,或多或少地复制第一个,但指定所需的前缀?
  • 这毫无意义,因为我有大约 20 个模块要预加载,所以复制会非常痛苦。
  • 我唯一能想到的另一件事是编写您自己对from 宏的修改(请参阅Ecto.SubQuery 中的defmacro),您可以在其中强制使用前缀选项。所以你可能有一个像from_public 这样的宏,但我认为这不会改善你的代码。您的设置有些特殊,您的代码应该有助于传达这一事实。它可能看起来很冗长,但明确设置前缀有助于准确传达每个查询的情况。 YMMV

标签: sql postgresql elixir ecto


【解决方案1】:

如果您想查询此架构中的所有关联,您可以在Repo.allRepo.oneRepo.preload 或用于运行查询的任何其他函数中设置前缀:

Repo.all(query, prefix: "public")

Repo.one(query, prefix: "public")

Repo.preload(entity, @preload, prefix: "public")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多