I declared the join in the 'file' side as well, and the instances are related correctly. But it doesn't fix the sort issue. In fact, whenever I customize the :reader function, the sort fails. And it should, but I don't know how to implement the sort myself for such columns.
On Mar 23, 10:19 am, Jose San Leandro <[email protected]> wrote: > Oops, I actually didn't had the tickets attribute. I defined the join > from ticket to file, not the other way round. I'll try your suggestion > now. > > Thanks! > > On Mar 23, 10:17 am, Jose San Leandro <[email protected]> > wrote: > > > Thanks for your response. > > > I already had the 'tickets' attribute in the file class, defining it > > as a join as you suggest. > > I also use a custom reader in the view for listing the files, counting > > all associated tickets. > > Everything is working fine: i get the list of files, and each one with > > the correct number of tickets. But when I click on the built-in 'sort' > > feature for the 'tickets' column, I get the error. > > > I looked at the source code of the widget, but I don't understand most > > of it right now. > > > Another thing I'm trying to do is generating a link for each cell in > > the table with the ticket count, so that it takes the user to the list > > of associated tickets for that file. I thought it should be done > > with :present-as, but I have no idea how. > > > Anyway, I greatly appreciate any help. > > > On Mar 23, 12:38 am, Saikat Chakrabarti <[email protected]> wrote: > > > > 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 -~----------~----~----~----~------~----~------~--~---
