Finally I found the solution to get the tags, but run into another issue
with CONTAINS (vs BELONGS).
The solution is to use alias with nested select:
Bin = db.bins.with_alias('bin')
tags = db(Bin.id==db.bins.id)._select(db.bins.tags_id)
rows = db(db.bins.id>1).select(
left=db.notes.on( (db.notes.tags_id.contains(tags)) )
)
But I have a new problem now. For example,
tags = (1,2,3,4) <-- this is the control set, which the nested select
should retrieve
set_A = (7,8,9)
set_B = (1,2)
set_C = (3,)
set_D = (4,5,6)
I want to get set_B, set_C, set_D, because they contain at least one of the
elements that are available in "tags".
So I use contains() instead of belongs()
But the generated SQL is
SELECT ... FROM bins LEFT JOIN notes ON ((notes.bin_id = bins.id) OR
(notes.tags_id LIKE '%|SELECT bins.tags_id FROM bins AS bin, bins WHERE
(bin.id = bins.id);|%')) WHERE (bins.id > 1);
Which is slightly different from what it is supposed to generate...
SELECT ... FROM bins LEFT JOIN notes ON ((notes.bin_id = bins.id) OR
((((notes.tags_id LIKE '%|1|%') OR (notes.tags_id LIKE '%|2|%')) OR
(notes.tags_id LIKE '%|3|%')) OR (notes.tags_id LIKE '%|4|%'))) WHERE (bins.id
> 1);
Am I in the wrong direction?
On Monday, October 15, 2012 5:19:13 PM UTC+8, lyn2py wrote:
>
> The field (*db.bins.tags_id*) has contents of a list:reference type, i.e.
> *|1|2|6|8|*
>
> I need to get it into a list (i.e. *[1,2,6,8]*) to be used in a DAL
> .select(). How should I do this?
>
> My code:
> rows = db(db.bins.id>1).select(
> left=db.notes.on(
> (db.notes.tags_id.contains((*db.bins.tags_id*).split('|'))
> )
> )
>
> As you can see, I tried to use the python split, but it returned an error.
> Any tips on how to proceed to make this work?
>
> Thanks!
>
--