在 Elixir / Ecto 中带有 Timex.Duration 的 WHERE 子句

WHERE clause with Timex.Duration in Elixir / Ecto

我对 Elixir 和 Phoenix 还很陌生(a.k.a. 菜鸟)。我正在通过创建 API 来学习 elixir 和 Phoenix。但是当我使用 Timex 库时,我遇到了关于模型查询的问题。我正在尝试添加;

def find_users_randomly(query, user_id, count \ 10) do
  from a in query,
    where: a.id != ^user_id,
    where: is_nil(a.last_time_get_msg_at),
    or_where: 45 < Timex.Duration.diff(a.last_time_get_msg_at, Duration.now, :minutes),
    order_by: [desc: :last_login_at],
    select: [:id, :uuid],
    limit: ^count
end

但是 Timex.Duration.diff(a.last_time_get_msg_at, Duration.now, :minutes) 给出以下错误。

== Compilation error on file web/models/user.ex ==
** (Ecto.Query.CompileError) `Duration.diff(a.last_time_get_msg_at(), Duration.now(), :minutes)` is not a valid query expression

我尝试使用 dynamiccast 以及基于管道的方法,但找不到解决方案。

我能为此做什么?你有什么建议?

包:

{:timex, "~> 3.1"}
{:phoenix_ecto, "~> 3.0"}
{:phoenix, "~> 1.2.1"}

模型示例;

defmodule Test.User do
  use Test.Web, :model
  use Timex

  alias Timex.Duration

  schema "users" do
    field :last_login_at, Ecto.DateTime, default: Ecto.DateTime
    field :last_time_get_msg_at, Ecto.DateTime

    timestamps()
  end

  def changeset(struct, params \ %{}) do
    struct
    |> cast(params, [:last_login_at])
    |> validate_required([:last_login_at])
  end

  def find_users_randomly(query, user_id, count \ 10) do
    from a in query,
      where: a.id != ^user_id,
      where: is_nil(a.last_time_get_msg_at),
      or_where: 45 < Duration.diff(a.last_time_get_msg_at, Duration.now, :minutes),
      order_by: [desc: :last_login_at],
      select: [:id],
      limit: ^count
  end
end

谢谢!

在 PostgreSQL 中,您可以减去 now() 和日期并与区间 45 minutes:

进行比较
or_where: fragment("now() - ? <= interval '45 minutes'", a.last_time_get_msg_at),