使用自定义函数作为Ecto order_by的参数



我有一个函数distance/2,它计算两个字符串之间的Levenshtein距离。

我想用这个作为order_by/3(文档)的参数,以便结果按Levenshtein距离排序到一个术语,因为我试图实现一个基本的自动完成。

目前,我有这样的:

Api.Repo.all(from p in Api.Product, select: p.name, order_by: distance(p.name, ^term), where: p.company_id == ^company_id)

然而这个错误,说明:

'distance(p.name ^term)' is not a valid query expression.

我还尝试将^移动到函数之前,如下所示:

Api.Repo.all(from p in Api.Product, select: p.name, order_by: ^distance(p.name, term), where: p.company_id == ^company_id)

然而,然后我得到一个抱怨,p/0是未定义的。

是否有办法使用我的函数作为order_by/3的参数?

您不能在这样的查询中调用Elixir函数。您要么必须在查询中使用数据库允许的函数,要么在将所有数据获取到Elixir后进行排序。第二个方法可以这样做:

products =
Api.Repo.all(from p in Api.Product, select: p.name, where: p.company_id == ^company_id)
|> Enum.sort_by(&distance(&1, term))

最新更新