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
-~----------~----~----~----~------~----~------~--~---

Reply via email to