Scala What is this "_1" in type? -
i understand error:
found : row.type (with underlying type _#tableelementtype) required: _1#tableelementtype
looks close, "1" in _1#tableelementtype
? can convert 1 in other?
edit: useful bits of codes context (play + slick):
abstract class genericdao[t <: abstracttable[_]](...) { def table: tablequery[t] def insert(model: t#tableelementtype) = db run (table += model) } trait tableobject[t <: abstracttable[_]] { def rowfromjson(jsobject: jsobject): t#tableelementtype def dao(driver: jdbcprofile, db: database): genericdao[t] } // controller action instance implementing `tableobject` above: val tableobject = tableobjectfactory("test") val row = tableobject.rowfromjson(request.body.asjson.get) val dao = tableobject.dao(driver, db) // tableobject has doa extending genericdao dao.insert(row)
example of tableobject
:
object testtable extends tableobject[test] { def dao(driver: jdbcprofile, db: database) = new testdao(driver, db) def rowfromjson(j: jsobject): testrow = { testrow(...) } class testdao(...) extends genericdao[test](driver, db) { ... } }
i use factory right 1 url:
object tableobjectfactory { def tableobjectfactory(name: string) = { name match { case "test" => testtable case "projects" => projectstable case "people" => peopletable ... } } }
although doesn't explain much, works if make dao parse request body , insert, instead of producing row object separately , applying 1 of dao's methods on it.
i got kinds of similar errors names such _$1#tableelementtype
, _1$u#tableelementtype
etc., think compiler aliases different instances of same class.
so solution do
val j: jsvalue = request.body.asjson.get val tableobject: tableobject[_] = tableobjectfactory(table) val dao = tableobject.dao(driver, db) val res: future[int] = dao.insert(j)
where new insert
method abstract in genericdao
, , in concrete implementations takes jsvalue
, parses it, inserts:
class testdao(override val driver: jdbcprofile, override val db: database) extends genericdao[test](driver, db) { import this.driver.api._ val table = tablequery[test] //def insert(model: testrow) = db run (table += model) // no! def insert(j: jsvalue): future[int] = { val row = testrow( (j \ "id").as[int], (j \ "name").as[string], (j \ "value").as[float], (j \ "other").as[string] ) db run (table += row) } }
at same time, makes play forms useless, thing anyway.
Comments
Post a Comment