Ecto的片段编译错误

时间:2018-02-06 17:06:18

标签: sql postgresql elixir ecto

我试图使用Ecto的片段系统化搜索Postgres JSON列的行为。

因此,我们假设我在profile列中有以下对象

{
  "first_name": "Margarita",
  "last_name": "Fernandez",
  "rut": "17.754.041-2"
}

我尝试做类似

的事情
from(u in Users.User, where: fragment("?->>'first_name' LIKE ?", u.profile, ^("%" <> "Marga" <> "%"))) |> Users.Repo.all

但是在一个函数中

def search(field, value) do
    from(u in Users.User, where: fragment("?->>'#{field}' LIKE ?", u.profile, ^("%" <> value <> "%"))) |> Repo.all
end

但是我收到以下错误

** (Ecto.Query.CompileError) fragment(...) expects the first argument to be a string for SQL fragments, a keyword list, or an interpolated value, got: `"?->>'#{field}' LIKE ?"`

我试图逃避它,在前一个变量中进行插值但是我做错了。

任何提示?

1 个答案:

答案 0 :(得分:1)

你不能像fragment一样进行字符串插值。在这种特殊情况下,您可以通过在?之后添加->>并将^field放入fragment参数来解决此问题:

fragment("?->>? LIKE ?", u.profile, ^field, ^("%" <> value <> "%"))