playframework 2.0 - Turn Scala Anorm record into a specific object -
using findby seen below, can search authentications table record key , value
def findby(key: string, value: string): = db.withconnection { implicit connection => sql("select * authentications {key}={value} limit 1").on('key -> key, 'value -> value) } example:
authentication.findbyme("email", "toot@toot.com") returns:
res1: = simplesql(sqlquery(select * authentications ?=? limit 1,list(key, value),none),list((key,parametervalue(email,anorm.tostatement$$anon$3@4ca9aed5)), (value,parametervalue(toot@toot.com,anorm.tostatement$$anon$3@18154945))),<function1>) how can turn authentication object? object fields got query.
i've tried following, can't passed nullable object error when there's there's null in 1 of columns. can't figure out how put use solutions offered here
val authentication_parser = get[string]("email") ~ get[string]("encrypted_password") ~ get[string]("user_id") ~ get[string]("token") ~ get[date]("created_at") ~ get[date]("updated_at") val authentication = { authentication_parser map { case email~encrypted_password~user_id~token~created_at~updated_at => authentication(email, encrypted_password, user_id, token, created_at, updated_at) } } using so:
def findby(key: string, value: string): = db.withconnection { implicit connection => sql("select * authentications {key}={value} limit 1").on('key -> key, 'value -> value).as(authentication *) } i'm new scala, i've been riddled problems one.
any column nullable in table should option in authentication object. example, if table this:
`email` varchar(255) not null, `encrypted_password` varchar(255) null, `user_id` int(11) not null, `token` varchar(255) null, `created_at` datetime not null, `updated_at` datetime null then should have:
case class authentication(email: string, password: option[string], userid: int, token: option[string], createdat: date, updatedat: option[date]) your parser like:
val authentication_parser = { get[string]("email") ~ get[option[string]]("encrypted_password") ~ get[string]("user_id") ~ get[option[string]]("token") ~ get[date]("created_at") ~ get[option[date]]("updated_at") map { case email~encrypted_password~user_id~token~created_at~updated_at => authentication(email, encrypted_password, user_id, token, created_at, updated_at) } } if reason don't want use option in authentication class, use getorelse in map portion , fill in default values (much uglier):
case email~encrypted_password~user_id~token~created_at~updated_at => authentication(email, encrypted_password.getorelse(""), user_id, token.getorelse(""), created_at, updated_at.getorelse(new date()) for paranoid, may want exclude hashed password parser when retrieving database:
val authentication_parser = { get[string]("email") ~ get[string]("user_id") ~ get[option[string]]("token") ~ get[date]("created_at") ~ get[option[date]]("updated_at") map { case email~user_id~token~created_at~updated_at => authentication(email, none, user_id, token, created_at, updated_at) } } i suggest change .as() parameter. sql("....").on(...).as(authentication_parser *) parse list[authentication]. since you're using limit 1 in query, better use authentication_parser.single (parses authentication) or authentication_parser.singleopt (parses option[authentication]). singleopt way go single records, single raise exception if nothing found.
lastly, ought make return type of function other any. (whatever matches parser) sorry wall of text.
Comments
Post a Comment