2016-04-28 2 views
1

Я думал, что строка concat была <>, но я не могу заставить ее работать в коде ниже. Я получаю сообщение об ошибкеКак обновить строку с помощью Ecto

Only literal binaries and strings are allowed, dynamic values need to be explicitly interpolated in queries with ^

Я добавил ^, но он по-прежнему не работает

def delete(conn, %{"id" => id}) do 
    card = Repo.get!(Card, id) 

    # Look for any cards that have chosen one as master 
    # Update name to deleted card + version name 
    # remove master_id 
    query = 
     from(c in Card, 
      where: c.master_id == ^id, 
      update: [set: [ estimate_name: (^card.estimate_name <> ^c.estimate_name), 
          master_id: 0 ]]) 
     |> Repo.update_all([]) 

Существует что-то странное, как код интерпретируется как мои строковых полей считаны как функции я думаю :

<<^card.estimate_name()::binary, ^c.estimate_name()::binary>>

ответ

3

Как один из двух частей, которые вы хотите, чтобы сцепить столбец из таблицы, вам нужно для выполнения конкатенации.

В Ecto нет функции для этого, поэтому вам нужно будет использовать fragment. Это должно работать на SQLite и PostgreSQL (я не уверен в MySQL):

update: [set: [estimate_name: fragment("? || ?", ^card.estimate_name, c.estimate_name), 
       master_id: 0]] 
+0

Я попытался воспроизвести это в новом экземпляре. 'from (p in Project, где: p.id ==^id, update: [set: [jobs: fragment ("? ||? ",^job_id, p.jobs)]])', где 'job_id' - целое число, а 'p.jobs' - массив целых чисел. Я получаю сообщение об ошибке: 'Postgrex ожидал список, который может быть закодирован/отличен, чтобы ввести« _int4 », получил 2.'. Я хочу добавить 2 в массив –

+0

Вы хотите добавить элемент 2 в массив или добавить 2 к каждому элементу массива? – Dogbert

+0

'ARRAY [4,5,6]' -> '2 || ARRAY [4,5,6] 'c.f. http://www.postgresql.org/docs/9.1/static/functions-array.html –

Смежные вопросы