在 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
我尝试使用 dynamic、cast 以及基于管道的方法,但找不到解决方案。
我能为此做什么?你有什么建议?
包:
{: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),
我对 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
我尝试使用 dynamic、cast 以及基于管道的方法,但找不到解决方案。
我能为此做什么?你有什么建议?
包:
{: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),