2017-05-30 17 views
0

「有効なクエリ式ではありません」原因はどこ。 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 

が、私はこのエラーを取得していますか?

+0

の線に沿って何かに – jonzlin95

+0

それは '未定義の関数pを語ります/ 0'となる。したがって、 'p'引数が製品として評価されていないようです。 '^(are_keywords_in_product(keywords、^ p))'も試してみました。 '^ pをmatch節の外で使うことはできません – BeniaminoBaggins

答えて

0

私はare_keywords_in_productが現在何をしているのかを見ています。もしEctoがそれをサポートしていれば、私は確信しています。私はあなたの最善の策は、代わりにfragment関数のために自分自身を書くことだと思う。

以下のコードは単なる出発点です。実際には正しいSQLクエリを書き出していませんでした。 jonzlin95 @

私はあなたが^(are_keywords_in_product(キーワード、p)を)行う必要があると思います

def are_keywords_in_product(keywords) do 
    Enum.map(keywords, fn(keyword) -> 
    "(?) =~" <> keyword <> " || (?) =~ " keyword 
    end) |> Enum.join("") 
end 

、クエリで

where: fragment(^(are_keyswords_in_product(keywords)), variables) 
関連する問題