2016-03-20 1 views
0

Я пытаюсь использовать Ecto.Adapters.SQL.query, он отлично работает, но не для массивов. Например, это утверждение не удается:Как использовать Ecto.Adapters.SQL.query с массивами?

Ecto.Adapters.SQL.query Repo, "SELECT p.* FROM posts p WHERE p.title in ($1)", 
    [["title1", "title2"]] 

Ошибка:

** (ArgumentError) Postgrex expected a binary that can be encoded/cast to 
type "text", got ["title1", "title2"]. Please make sure the value you are 
passing matches the definition in your table or in your query or convert 
the value accordingly. 

UPDATE

Там нет простого способа сделать это, но это не является ограничение Ecto, это ограничение баз данных SQL/PostgreSQL, more details and workaround.

Это трудно поверить, что в 2016 году базы данных SQL по-прежнему лакообразование такую ​​основную функцию ...

ответ

2

Я думаю, что ответ на этот вопрос в значительной степени то же самое с вашего предыдущего вопроса. Просто используйте синтаксис in от here.

Update

Для запуска исходного запроса SQL для вашего примера, вы можете использовать следующее:

Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT p.* FROM POSTS p WHERE p.TITLE IN ($1, $2)", ["title1", "title2"]) 
+0

Спасибо, да, возможно, это связано с Query DSL, но тем не менее - возможность выполнения необработанного SQL, по-видимому, имеет фундаментальное значение для библиотеки SQL. Я бы хотел увидеть ответ - как это сделать. –

+0

@AlexeyPetrushin обновил ответ – JustMichael

+0

Но как визуализировать результат в представлении, то есть как использовать 'Ecto.Adapters.SQL.query (MyApp.Repo, ..'? Как передать результат на просмотр? , –

1

Если вы используете Postgres вы также можете использовать ANY

Ecto.Adapters.SQL.query(
    Repo, 
    "SELECT p.* FROM posts p WHERE p.title = ANY($1)", 
    [["title1", "title2"]] 
) 

И Postgres производит same query plan for In vs Any