Thanks!
Got it woking now but i got strange results:
("Not working" means that the same referenced record is being fetched every
time and not read from the dict)
This is not working:
Field.Virtual('created_by_record',
lambda r: users.setdefault(r.comment.created_by.id, db.
auth_user(r.comment.created_by))),
This is also not working:
users = {}
def created_by_record(r):
k = r.comment.created_by.id
return users.setdefault(k, db.auth_user(k))
Field.Virtual('created_by_record', created_by_record),
But this is working:
users = {}
def created_by_record(r):
k = r.comment.created_by.id
if k in users:
return users[k]
users[k] = db.auth_user(k)
return users[k]
Field.Virtual('created_by_record', created_by_record),
On Thursday, August 15, 2013 6:37:18 PM UTC+2, Anthony wrote:
>
> Good point. I suppose you can adapt your method to work with a virtual
> field:
>
> owners = {}
> db.define_table('dog',
> ...
> Field.Virtual('owner_record',
> lambda r: owners.setdefault(r.dog.owner, db.person(r.dog.owner)))
>
> That will store each fetched owner record in the owners dict, so the
> record will be copied from the dict if it is already there rather than
> pulled from the db.
>
> Anthony
>
> On Thursday, August 15, 2013 12:09:02 PM UTC-4, Quint wrote:
>>
>> But when when a row is calculating it's virtual field, it will fetch the
>> referenced row even when some other row from the initial set has already
>> fetched this same referenced row (when they are referencing the same
>> thing). So they will both perform the same fetch.
>>
>> ?
>>
>> I want to do this fetch 1x and use that record for all rows from the
>> initial set that reference it.
>> On Aug 15, 2013 4:18 PM, "Anthony" <[email protected]> wrote:
>>
>>> On Thursday, August 15, 2013 10:04:45 AM UTC-4, Quint wrote:
>>>
>>>> thnx,
>>>>
>>>> but my goal is to prevent repeated queries for the same record when
>>>> accessing ref fields on rows from the same result set.
>>>>
>>>> I'm missing something, how do those Virtual Fields achieve that?
>>>>
>>>
>>> Yes, that's exactly what the virtual field does -- when the the Rows
>>> object is created from the initial select, the value of the virtual field
>>> is calculated for each Row, and it remains in the Row (i.e., it is not
>>> re-calculated on each access). There is also Field.Method(), which does
>>> re-calculate on every access (the advantage is that it is lazy, so nothing
>>> is calculated until accessed -- and because of that, it can take arguments
>>> at the time it is called).
>>>
>>> And about the join, wouldn't that mean it won't work on GAE?
>>>>
>>>
>>> Oh, yeah, forgot you said you are on GAE.
>>>
>>> Anthony
>>>
>>> --
>>>
>>> ---
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "web2py-users" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/web2py/IrAe-AGpiMU/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.