Elixir / Ecto中的Timex.Duration的WHERE子句

时间:2017-02-07 16:25:05

标签: elixir phoenix-framework ecto

关于Elixir和凤凰,我很新(a.k.a. noob)。我正在通过创建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

我尝试使用动态强制转换以及基于管道的但我无法找到解决方案。

我能为此做些什么?你的建议是什么?

软件包:

{: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

谢谢!

1 个答案:

答案 0 :(得分:3)

在PostgreSQL中,您可以减去now()和日期,并与间隔45 minutes进行比较:

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