2017-03-03 9 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 

ユーザーがテキストボックスに(空白で区切って)項のいずれかの番号を入力することができ、その後、これらの用語は、結果セットをフィルタリングするために使用されています。私は、クエリに追加されている条項は、(ANDさ)どこのセットに元の文字列を変換するためにString.splitを使用しています:

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) 
関連する問題