2017-03-03 43 views
0

我試圖使用Ecto/postgres創建搜索查詢。這裏是我的查詢的第一部分:根據列表對Ecto查詢重複where子句語句

query = from l in Log, 
    join: u in assoc(l, :user), 
    where: u.id == ^current_user.id, 
    select: l 

用戶可以在任何數量的術語(用空格隔開)輸入到一個文本框,然後使用這些術語來篩選結果集。我使用String.split到原始字符串轉換爲一組的where子句(AND'd一起)被添加到查詢:

search_term 
|> String.split() 
|> Enum.map(fn(term) -> 
    query = from l in query, 
    where: fragment("comment ~* ?", ^term) 
end) 

除了這個聲明沒有任何效果。我假設query作業只存在於函數的範圍內。我的思想被命令性思維籠罩。我如何以功能性的方式實現這一點?

回答

1

我假設查詢分配只存在於函數的範圍內。

是的,正好。

你應該使用Enum.reduce對於這一點,並通過原始查詢作爲累加器的初始值:

search_term 
|> String.split() 
|> Enum.reduce(query, fn(term, query) -> 
    from l in query, where: fragment("comment ~* ?", ^term) 
end)