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