关于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
谢谢!
答案 0 :(得分:3)
在PostgreSQL中,您可以减去now()
和日期,并与间隔45 minutes
进行比较:
or_where: fragment("now() - ? <= interval '45 minutes'", a.last_time_get_msg_at),