Naftoli, The ManyToMany class is in the new lift-mapper jar, but the source is not available in 1.1-SNAPSHOT-sources. Could you provide? Thanks,
Glenn... On Jul 27, 3:50 pm, Naftoli Gugenheim <[email protected]> wrote: > I committed it last night, so I think it should be there. > To use many-to-many, simply mix ManyToMany to your mapper, then create a > MappedManyToMany field like any other field. See the scaladocs for specifics. > Then in your view you can use the field like a collection, e.g., remove an > element with -=, and save the mapper to apply the changes. > > ------------------------------------- > > glenn<[email protected]> wrote: > > Sounds great. I've been using hacks such as adding code like this to > my mapper classes just to create a Many-to-Many > relationship between say, tag and content tables (using an > intermediary ContentTag table). Similarly, I've done User/Roles > relationships. > > private object _dbTags extends HasManyThrough(this, Tag, ContentTag, > ContentTag.content, ContentTag.tag) > > private[model] var _tags : List[Tag] = _ > > private val locker = new Object > > def tags : List[Tag] = locker.synchronized { > if(_tags eq null){ > _tags = _dbTags() > } > _tags > } > > def tags(newTags:String) = locker.synchronized { > _tags = newTags.roboSplit(",").map(Tag.byName(_)) > this > } > > def tags(newTags:List[Tag]) = locker.synchronized { > _tags = newTags > this > } > > def tagsToo:List[Tag] = ContentTag.findAll(By(ContentTag.content, > this.id)).map(_.tag.obj.open_!) > > def showTags = Text(tags.map(_.name.is).mkString(", ")) > > But, then I have to add code like this to the meta-mapper objects: > > def addTags(entry: Content) { > if(entry._tags ne null){ > entry._tags.foreach(ContentTag.join(_, entry)) > } > } > > def delTags(entry:Content) = > ContentTag.findAll(By(ContentTag.content, entry)).foreach > (_.delete_!) > > It's not very pretty. Nor easy to duplicate. > > I hope your new code is considerably less messy. > > Is it in the repo-snapshot repository yet. > > On Jul 27, 12:57 pm, Naftoli Gugenheim <[email protected]> wrote: > > > I committed some code last night, which can help building mapper-based view > > snippets, with G-d's help. It includes the following classes: > > (1-2) net.liftweb.mapper.OneToMany, ManyToMany: Gives a more > > object-oriented approach to managing related entites. You can manage the > > many side of a 1-n and n-n as a mutable collection of children, and the > > parent of a child can be set directly, instead of via its id. And the > > children are not saved to the database when you add them until you call > > save on it or its parent, nor deleted when you remove tem until you call > > delete_!, which is very helpful when you need to keep track of adds/removes > > through multiple requests. For example, if you are displaying a list and > > you can click delete, but it shouldn't be permanently deleted until you > > click save. > > There is a new package, ...mapper.view, which contains a number of > > utilities for mapper-based views: > > (3-4) ModelView and ModelSnippet provide a number of building blocks for > > views that are too complex to CRUDify. Inherit ModelSnippet (which extends > > StatefulSnippet) and wrap your entities in ModelView (view is used in the > > sense of a wrapper). > > (5) Util provides some more building blocks that just be imported, without > > needing a ModelSnippet context. > > (6-7) Paginator makes it easy to create paginated, user sortable listings. > > You can use PaginatedSnippet instead of ModelSnippet to help. > > (8-10) ItemsList lets you manage a list of entities with pending additions > > and deletions. It's used by TableEditor, which is a very easy to use and > > customizable snippet to edit tables directly. It's useful for editing short > > lists, e.g., a lookup table like cities. Don't forget to register the table > > in Boot. > > (11) Then there's the experimental FormProcessor, if you need your form to > > be processed in one block instead of separate closures, e.g., to surround > > with try. > > (12) Also experimental is sitemap.XmlMenu which lets you write menus in xml. > > (13) I may add CaseEnum, which lets you write case classes that > > automatically double as an Enumeration. > > Questions, comments, suggestions, and constructive criticism are more than > > welcome! > > Thanks. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---
