Not tested or compiled object isLab extends MappedBoolean(this) 1. def source: Box[Source] = if(isLab.is) lab.obj else scientist.obj def source_=(s: Source) = s match { case l: Lab => isLab(true); lab(l) // same for scientist }
2. object source extends MappedLong { def obj = if(isLab) Lab.find(is) else Scientist.find(is) def obj_=(s: Source) = s match { case _: Lab => set(s.id) // same for scientist } The advantage of 1 is database FK constraints. The advantage of 2 is fewer fields. ------------------------------------- Mads Hartmann<mads...@gmail.com> wrote: Thank you for taking your time to answer my question I don't think I fully understand how to implement any of the suggested solutions, if you have the time I would love a code example :) Thanks a lot, Mads Hartmann Jensen On Feb 5, 7:34 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote: > Basically, either use two protected LongMappedMappers and a public > getter/setter that takes a boolean into account in both directions; or use a > MappedLong, with > def obj = whicheverLookUpTable.find(this.is) > and > override def set(s: Source) = s match ... > > Sorry for the brevity, if unclear please ask. > > ------------------------------------- > > Mads Hartmann<mads...@gmail.com> wrote: > > Naftoli would you please re-post your solution :) I could really use > the help > > On Feb 5, 6:56 pm, Naftoli Gugenheim <naftoli...@gmail.com> wrote: > > > > > > > Peek --www.getpeek.com > > Please forward any bad messages to feedb...@getpeek.com > > > ------------------------------------- > > > Ross Mellgren<dri...@gmail.com> wrote: > > > This is actually fairly common that messages Naftoli sends are empty, or > > don't get threaded onto the original discussion, or formatting comes out > > funny. Naftoli, what email client are you using? > > > -Ross > > > On Feb 5, 2010, at 1:49 AM, Mads Hartmann wrote: > > > > Hey Naftoli, > > > I think something might have broken your first message, It's a blank > > > message if you view it through the web-interface: > > >http://groups.google.com/group/liftweb/browse_thread/thread/e2317e5db... > > > > If you have a solution I would love to hear it :) > > > > On Feb 5, 1:52 am, Naftoli Gugenheim <naftoli...@gmail.com> wrote: > > >> Does my approach not work? > > > >> ------------------------------------- > > > >> Mads Hartmann<mads...@gmail.com> wrote: > > > >> Yeah that helped, my lab and scientist now looks like this: > > > >> /------------------------------- code > > > >> trait BaseSourceTrait[ T <:BaseSourceTrait[T] ] extends > > >> LongKeyedMapper[T] { > > > >> self: T => > > > >> override def primaryKeyField = id > > >> object id extends MappedLongIndex(this) > > > >> object name extends MappedPoliteString(this, 256) > > >> object sourceType extends MappedEnum(this,SourceTypes) > > > >> object SourceTypes extends Enumeration { > > >> val Scientist = Value("Scientist") > > >> val Lab = Value("Lab") > > >> } > > > >> } > > > >> class Scientist extends BaseSourceTrait[Scientist] { > > > >> def getSingleton = Scientist > > > >> object birth extends MappedInt(this) > > >> object death extends MappedInt(this) > > >> object nationality extends MappedPoliteString(this, 128) > > > >> } > > > >> object Scientist extends Scientist with LongKeyedMetaMapper[Scientist] > > >> { > > >> override def dbTableName = "Source" > > > >> } > > > >> class Lab extends BaseSourceTrait[Lab] { > > > >> def getSingleton = Lab > > > >> object institution extends MappedLongForeignKey(this, Institution) > > > >> } > > > >> object Lab extends Lab with LongKeyedMetaMapper[Lab] { > > >> override def dbTableName = "Source" > > > >> } > > > >> /------------------------------- code ends > > > >> My only problem now is that I can't figure out how to implement the > > >> following: > > > >> A Discovery (a mapped class) needs to have a foreign key to the source > > >> that made the discovery, this could be either a lab or a scientist, so > > >> normally i would have a field with a reference to the super-class of > > >> both Scientist and Lab - However, I don't have a super-class, I just > > >> have a trait :) > > > >> I would like to be able to write something like this: > > > >> /------------------------------- code starts again > > > >> class Discovery extends LongKeyedMapper[Discovery] with IdPK { > > > >> def getSingleton = Discovery > > > >> // primatives > > >> object description extends MappedDateTime(this) > > >> object year extends MappedInt(this) > > >> object reference extends MappedPoliteString(this, 128) > > > >> // relationships > > >> object source extends MappedLongForeignKey(this, > > >> BaseSourceTrait) // > > >> <-- this is what i want. > > > >> } > > > >> object Discovery extends Discovery with LongKeyedMetaMapper[Discovery] > > > >> /------------------------------- code ends > > > >> As always I truely appreciate the help you guys are giving me :) > > > >> Thanks, > > >> Mads Hartmann Jensen > > > >> On Feb 4, 9:56 pm, David Pollak <feeder.of.the.be...@gmail.com> wrote: > > > >>> Please take a look at the MegaProtoUser and MegaMetaProtoUser code for > > >>> examples of how to create traits that can be mixed into classes. > > > >>> Does that help? > > > >>> On Thu, Feb 4, 2010 at 9:58 AM, Mads Hartmann Jensen > > >>> <mads...@gmail.com>wrote: > > > >>>> hello Jeppe, > > > >>>> In my project I've got the following three models: A discovery, a > > >>>> Scientist > > >>>> and a lab. The Discovery has been invented by someone, this is either a > > >>>> single scientist or sometimes a lab - This is easily done through > > >>>> inheritance (would create a superclass named source) but I'm not sure > > >>>> how to > > >>>> do this so it maps nicely to the database. > > > >>>> Scientist and Lab only share one attribute so what I'm most interested > > >>>> in > > >>>> is to be able express that a Discovery has s source that can be either > > >>>> a lab > > >>>> or scientist :) > > > >>>> Hope this explains my problem more clearly, thanks for the help > > > >>>> Mads Hartmann > > > >>>> Sent from my iPhone > > > >>>> On 04/02/2010, at 18.17, Jeppe Nejsum Madsen <je...@ingolfs.dk> wrote: > > > >>>> Mads Hartmann <mads...@gmail.com> writes: > > > >>>>> Hello Everyone, > > > >>>>>> I'm currently trying to figure out how to map objects with > > >>>>>> inheritance > > >>>>>> using the Mapper framework. I've got a Lab and a Scientist who > > >>>>>> inherit > > >>>>>> from Source. > > > >>>>>> As I understand there's no direct way to do inheritance using the > > >>>>>> Mapper framework so I'm trying to figure out how to implement 'Single > > >>>>>> Table Inheritance'. > > > >>>>>> Right now I'm trying to create a single trait (Source) for the values > > >>>>>> that they share called BaseSource and my idea is to mix it in both > > >>>>>> Lab > > >>>>>> and Scientist. I would then define the table name of both scientist > > >>>>>> and lab to be the same - I think this would work but what I'm not > > >>>>>> sure > > >>>>>> of is the following: > > > >>>>>> - If both Scientist and Lab mixes in the IdPK trait and use the same > > >>>>>> table, will the id still be unique? > > >>>>>> - A Discovery has a source, how do i create MappedLongForeignKey to > > >>>>>> the table they share (lab, scientist)? > > > >>>>>> I hope you'll be able to help me out :) > > > >>>>> I can't say I follow the above :-) Do you want to share tables, code > > >>>>> or > > >>>>> both? Maybe list the table structure and explain how you would like to > > >>>>> map it.... > > > >>>>> /Jeppe > > > >>>>> -- > > >>>>> You received this message because you are subscribed to the Google > > >>>>> Groups > > >>>>> "Lift" group. > > >>>>> To post to this group, send email to lift...@googlegroups.com. > > >>>>> To unsubscribe from this group, send email to > > >>>>> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com > > >>>>> > > > >>>>> . > > >>>>> For more options, visit this group at > > >>>>>http://groups.google.com/group/liftweb?hl=en. > > > >>>> -- > > >>>> You received this message because you are subscribed to the Google > > >>>> Groups > > >>>> "Lift" group. > > >>>> To post to this group, send email to lift...@googlegroups.com. > > >>>> To unsubscribe from this group, send email to > > >>>> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com > > >>>> > > > >>>> . > > >>>> For more options, visit this group at > > >>>>http://groups.google.com/group/liftweb?hl=en. > > > >>> -- > > >>> Lift, the simply functional web frameworkhttp://liftweb.net > > >>> Beginning Scalahttp://www.apress.com/book/view/1430219890 > > >>> Follow me:http://twitter.com/dpp > > >>> Surf the harmonics > > > >> -- > > >> You received this message because you are subscribed to the Google > > >> Groups "Lift" group. > > >> To post to this group, send email to lift...@googlegroups.com. > > >> To unsubscribe from this group, send email to > > >> liftweb+unsubscr...@googlegroups.com. > > >> For more options, visit this group > > >> athttp://groups.google.com/group/liftweb?hl=en. > > > > -- > > > You received this message because you are subscribed to the Google Groups > > > "Lift" group. > > > To post to this group, send email to lift...@googlegroups.com. > > > To unsubscribe from this group, send email to > > > liftweb+unsubscr...@googlegroups.com. > > > For more options, visit this group > > > athttp://groups.google.com/group/liftweb?hl=en. > > > -- > > You received this message because you are subscribed to the Google Groups > > "Lift" group. > > To post to this group, send email to lift...@googlegroups.com. > > To unsubscribe from this group, send email to > > liftweb+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/liftweb?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "Lift" group. > To post to this group, send email to lift...@googlegroups.com. > To unsubscribe from this group, send email to > liftweb+unsubscr...@googlegroups.com. > For more options, visit this group > athttp://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.