微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Elixir Ecto 中使用动态比较运算符?

如何解决如何在 Elixir Ecto 中使用动态比较运算符?

所以我试图允许对数据库中的各个字段进行搜索,情况是这样的:

  1. 用户想要查找由 2020 年 10 月之前加入的用户创建的所有帖子
  2. 用户想要查找由 2020 年 10 月之后加入的用户创建的所有帖子
  3. 用户想要查找由 2020 年 10 月 5 日加入的用户创建的所有帖子

通常我需要像这样编写这个查询的各种版本:

def before_date(query,date) do
 query
 |> where([posts,users],users.inserted_at < ^date))
end 
def after_date(query,users.inserted_at > ^date))
end 
def on_date(query,users.inserted_at == ^date))
end

然后要过滤帖子日期本身,我需要重新编写这些查询并使用 posts.inserted_at 代替。

因此,我正在寻找一种方法来动态比较内部项目和 Ecto 查询

我发现了这个问题: Create Ecto query with dynamic operators

但它没有编译,因为它抱怨查询无效:

== Compilation error in file lib/mmsapi/liquid/search/filters.ex ==
** (CompileError) lib/mmsapi/liquid/search/filters.ex:338: invalid call operator(field(o,^field_name),^value)
    expanding macro: Liquid.Search.Filters.custom_where/4

所以稍微修改一下,通过用实际操作符替换变量操作符来实现:

defmacrop custom_where(t,f,v,:==) do
 {:==,[context: Elixir,import: Kernel],[
    {:field,[],[t,{:^,[f]}]},[v]}
   ]}
end

def compare_field(query,field_name,value,operator) do
  query
  |> where([o],^custom_where(o,operator))
end

但是我得到这个错误

== Compilation error in file lib/mmsapi/liquid/search/filters.ex ==
** (CompileError) lib/mmsapi/liquid/search/filters.ex:327: cannot use ^field_name outside of match clauses

这是我想要实现的代码

 field_name = :inserted_at

 value = DateTime.utc_Now()

 operator = :==

 query
 |> where([posts,custom_where(users,operator))

任何帮助将不胜感激,并提前感谢您!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。