Как обновить несколько столбцов с помощью Slick Lifted Embedding?

Как обновить несколько столбцов с помощью Slick Lifted Embedding? Этот документ мало что говорит.

Я ожидал, что это будет что-то вроде этого

Query(AbilitiesTable).filter((ab: AbilitiesTable.type) => ab.id === ability_id).map((ab: AbilitiesTable.type) => (ab.verb, ab.subject)).update("edit", "doc")

person expert    schedule 26.05.2013    source источник


Ответы (2)


Я понял. Это должно быть так

val map = Query(AbilitiesTable)
  .filter(_.id === ability_id)
  .map(ab => ab.verb ~ ab.context)

map.update(("", ""))

Typesafe, почему ваша документация такая плохая? Мне приходится гуглить каждую глупость или часами копаться в юнит-тестах. Пожалуйста, улучшите его. Спасибо.

person expert    schedule 26.05.2013
comment
Обратите внимание, что это работает только с обновляемыми наборами результатов, которые требуют включения идентификатора. Если вы попытаетесь использовать это без включения поля идентификатора в построенный запрос, произойдет сбой. - person BeepDog; 14.06.2013
comment
Извините... но что такое AbilitiesTable? Это тот TableQuery объект? Класс такой: class CompanyTable(tag: Tag) extends Table[Company]? - person windweller; 05.07.2014

В последних версиях Slick этот способ написания работает:

Users.filter(_.id === filterId)
     .map(x => (x.name, x.age))
     .update(("john", 99))

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

person nemoo    schedule 14.01.2014
comment
В intellij запятая может не работать. вы можете альтернативно написать так (x.name ~ x.age) - person Rajeev; 12.02.2014
comment
В версии Intellij 2016 запятая работает нормально. - person null; 22.03.2017
comment
Не забывайте о кортежах в .map(x => (...)), а также в update(("x", "y")), так что двойные скобки. - person kosiara - Bartosz Kosarzycki; 11.03.2018