【问题标题】:Elixir Ecto Alter Query Based on Function ParamsElixir Ecto Alter Query 基于函数参数
【发布时间】:2017-02-24 08:24:43
【问题描述】:

我使用 Ecto 在 Elixir/Phoenix 中运行了一系列复杂的查询。这些目标是使这些查询既可以用于创建新条目,也可以用于更新以前的行。为此,我设想使用一个函数参数来定义我们是否正在更新表。例如,现在我有以下功能:

# Retrieves the stats on the user chargebacks
defp get_chargebacks(%{user_id: user_id} = map) do
    query =
      from u in Users,
      left_join: c in ChargeBacks, on: [user_id: u.id],
      where: u.id == ^user_id,
      select: %{chargeback_amount_cents: sum(c.amount), chargeback_amount_count: count(c.user_id), chargeback_amount_currency: @default_currency},
      group_by: u.id
    result = query
    |> RepoBVCore.one
    Map.merge(map, Map.put(result, :chargeback_amount_cents, Map.get(result, :chargeback_amount_cents) || 0))
end

我想更改函数,使其如下:

defp get_chargebacks(%{user_id: user_id} = map, is_update \\ false)

如果is_update = true 那么我想在函数中添加一个额外的where 子句(例如):

where: c.amount > 100

如何更改我的原始函数以有条件地更改查询语句?谢谢。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    您可以通过传递 2 个名称的列表作为绑定到 Ecto.Query.where/3 来访问 cc 将是该列表中的第二个项目,因为它是原始查询中的第一个 join(源表是第一个,连接按照它们在原始查询中的连接顺序排在后面):

    defp get_chargebacks(%{user_id: user_id} = map, is_update \\ false) do
      query =
        from u in Users,
        left_join: c in ChargeBacks, on: [user_id: u.id],
        where: u.id == ^user_id,
        select: %{chargeback_amount_cents: sum(c.amount), chargeback_amount_count: count(c.user_id), chargeback_amount_currency: @default_currency},
        group_by: u.id
      query =
        if is_update do
          query |> where([u, c], c.amount > 100)
        else
          query
        end
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多