web-dev-qa-db-fra.com

Comment construire une clause de tableau WHERE IN avec Ecto?

Comment trouver des messages dans une liste d'ID donnée?

Cela ne fonctionne pas:

posts = Post |> where(id: [1, 2]) |> Repo.all

Exemple dans Rails:

Post.where({ id: [1, 2]})
# SELECT * FROM posts WHERE id IN (1, 2)
27
luzny

Les éléments suivants devraient fonctionner:

posts = Post |> where([p], p.id in [1, 2]) |> Repo.all
45
Gazler

La réponse acceptée donne undefined function p/0 pour moi, alors je suis venu à ceci:

from(p in Post, where: p.id in [1, 2]) |> Repo.all
22
denis.peplin

D'autres affiches ont donné les modèles "mots clés" et "expressions" nécessaires, mais je voulais commenter et souligner que si vous interpolez les valeurs d'une liste, vous avez besoin du ^ opérateur avant la variable. Vous devez également importer le module qui contient les macros (spécial car les macros ont des besoins de compilation différents) avant d'essayer l'un ou l'autre. Tout cela avec ecto 2.1.4, btw. Donc:

import Ecto.Query
...

id_list = [1,2,4,5,6]


# "expressions"

Post
|> where([p], p.id in ^id_list)


# "keywords"

from(p in Post, where: p.id in ^id_list)
11
jnmandal