「有効なクエリ式ではありません」原因はどこ。 EGユーザーがいくつかのキーワードを入力した場合、キーワードが製品名または製品ブランドのいずれかである場合にのみ商品を返します。機能を持つ句は、私はこの作業クエリを持っている
私の試み:キーワードは、商品名やブランドにある場合効果的create_query(keywords)
で私の最後のwhere
句がtrueを返す必要があります
def are_keywords_in_product(keywords, product) do
IO.inspect(product)
Enum.map(keywords, fn(keyword) ->
product.name =~ keyword || product.brand =~ keyword
end)
end
def create_query(keywords, categories, shop_ids) do
products_shops_categories = from p in Product,
join: ps in ProductShop, on: p.id == ps.p_id,
join: s in Shop, on: s.id == ps.s_id,
join: pc in ProductCategory, on: p.id == pc.p_id,
join: c in Subcategory, on: c.id == pc.c_id,
where: c.id in ^categories,
where: s.id in ^shop_ids,
where: are_keywords_in_product(keywords, p),
select: [p, c, s]
end
def create_query(nil, categories, shop_ids) do
products_shops_categories = from p in Product,
join: ps in ProductShop, on: p.id == ps.p_id,
join: s in Shop, on: s.id == ps.s_id,
join: pc in ProductCategory, on: p.id == pc.p_id,
join: c in Subcategory, on: c.id == pc.c_id,
where: c.id in ^categories,
where: s.id in ^shop_ids,
select: [p, c, s]
end
......create_query(keywords, categories, shop_ids) |> Api.Repo.all
(私は試してみて、代わりに何もfalseを返す必要があるかもしれませんが、もしキーワードません製品に含まれていますか?)私はエラーを取り除くにはどうすればよい
== Compilation error on file lib/api/router.ex ==
** (Ecto.Query.CompileError) `are_keywords_in_product(keywords, p)` is not a valid query expression.
* If you intended to call a database function, please check the documentation
for Ecto.Query to see the supported database expressions
* If you intended to call an Elixir function or introduce a value,
you need to explicitly interpolate it with^
expanding macro: Ecto.Query.where/3
lib/api/router.ex:169: Api.Router.create_query/3
expanding macro: Ecto.Query.select/3
lib/api/router.ex:169: Api.Router.create_query/3
expanding macro: Ecto.Query.from/2
lib/api/router.ex:169: Api.Router.create_query/3
:
が、私はこのエラーを取得していますか?
の線に沿って何かに – jonzlin95
それは '未定義の関数pを語ります/ 0'となる。したがって、 'p'引数が製品として評価されていないようです。 '^(are_keywords_in_product(keywords、^ p))'も試してみました。 '^ pをmatch節の外で使うことはできません – BeniaminoBaggins