我试图使用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 ?"`
我试图逃避它,在前一个变量中进行插值但是我做错了。
任何提示?
答案 0 :(得分:1)
你不能像fragment
一样进行字符串插值。在这种特殊情况下,您可以通过在?
之后添加->>
并将^field
放入fragment
参数来解决此问题:
fragment("?->>? LIKE ?", u.profile, ^field, ^("%" <> value <> "%"))