Another thing I forgot to mention - if you are using clsql, you can
have slots on your model that are of type join that reference all the
associated objects.  This just makes the code a little cleaner (and
you don't have to write as much SQL).  So, your model for file could
be:

(clsql:def-view-class file ()
   ((id
     :initarg :id
     :accessor file-id
     :type integer)
    (name
     :initarg :name
     :accessor file-name
     :type string)
    (tickets
      :accessor file-tickets
      :db-kind :join
      :db-info (:join-class ticket
                    :home-key id
                    :foreign-key file-id
                    :set t)))

Where your other model is called "ticket" and has slots for id (the
ticket's id) and file-id (referencing the file the ticket is a part
of).  Then, in your :reader lambda for your view, you can just sum the
values in the list that you get from calling (file-tickets obj) and
you don't need to write any clsql syntax stuff.

On Mar 22, 7:31 pm, Saikat Chakrabarti <[email protected]> wrote:
> To do this, should try adding a tickets slot to your file view that
> doesn't map to your file model.  The way to get this to work is to
> have a :reader for your ticket slot.  Thus, if your model is:
>
> (clsql:def-view-class file ()
>   ((id
>     :initarg :id
>     :accessor file-id
>     :type integer)
>    (name
>     :initarg :name
>     :accessor file-name
>     :type string)))
>
> you can have a view as follows:
>
> (defview file-view (:inherit-from '(:scaffold file)
>                              :type table)
>   (tickets :reader (lambda (obj) (some-code-for-getting-total-
> tickets)))
>
> Here, "obj" passed into the :reader for tickets is a reference to your
> file object, so you should be able to use that to construct some query
> to get the total number of tickets for that file and have your lambda
> return that.
>
> Hope that helps.
>
> On Mar 22, 5:54 am, Jose San Leandro <[email protected]>
> wrote:
>
> > Hi,
>
> > I have a minimal db model with two tables: FILE and TICKET. A FILE is
> > a collection of TICKETs, and a TICKET can only belong to one FILE. I'm
> > pasting the relationship below, hoping you can see it using a fixed
> > font.
>
> >                            +------------------+                             
> >  +-------------------+
> >                            |                  |                 X           
> >  |                   |
> >                            |                  |1               / \
> > N|                   |
> >                            |      FILE        +<--------------X
> > X=========>|              TICKET      |
> >                            |                  |                \ /          
> >  |                   |
> >                            |                  |                 X           
> >  |                   |
> >                            +------------------+                             
> >  +-------------------+
>
> > The FILE table doesn't contain an explicit column for the number of
> > associated tickets. I don't want to denormalize the model if I can
> > avoid it.
> > I present the list of files in a datagrid, defining a new column
> > 'tickets', with a custom :reader function, to display that information
> > for each ticket. However, the built-in sort feature fails since it
> > uses a generic way consisting of autogenerated sql queries, and that
> > information is not explicit in the FILE table:
>
> > While accessing database #<MYSQL-DATABASE localhost/prj/prj OPEN
> > {B8FF6D9}>
> >   with expression "SELECT FILE.NAME,FILE.ID,FILE.TICKETS FROM FILE
> > ORDER BY FILE.TICKETS ASC LIMIT 6 OFFSET 0":
> >   Error 1054 / Unknown column 'FILE.TICKETS' in 'field list'
> >   has occurred.
>
> > I just need a way to customize the generated query, in order to do the
> > join myself and count the number of TICKETs pointing to each FILE. How
> > can I override that query?
>
> > Thank you in advance.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"weblocks" 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/weblocks?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to