Thanks, Jeremy, it was exectly what I've need!
I am ashamed for not reading the docs thoroughly.

V.



2014-05-30 10:00 GMT+03:00 Jeremy Evans <[email protected]>:

> On Thursday, May 29, 2014 5:37:31 AM UTC-7, Victor 'Zverok' Shepelev wrote:
>>
>> Hi all.
>>
>> I have a situation here:
>> One of my models (called, basically, Mention) is stored not in one table,
>> but in "dumbly sharded" list of tables:
>> * mentions of client 1 in table mentions_client_1
>> * mentions of client 82 in table mentions_client_82
>> ...and so on.
>>
>> So, class Mention has method Mention.make_class(client), which
>> dynamically generates class, descending from Mention, with "right" dataset
>> :"mentions_client_#{client.id}".
>>
>> Surprisingly, everything works pretty well.
>>
>> But there goes complactions:
>> When I generate class based on Mention, I setup some additional
>> associations:
>>
>> one_to_many: :topics,
>>   class: MentionTopic,
>>   conditions: {client_id: self.client.id} # should be setup dynamically
>> because of this condition
>>
>> And corresponding association in MentionTopic:
>>
>> many_to_one :mention,
>>     dataset: ->{Mention2.make_class(client).dataset.where(id:
>> mention_id)}
>>
>> End everything still works, hooray!
>>
>> Now the problem:
>>
>> MentionTopic.where(client_id: 1).eager(:mention)
>> is NOT working: Invalid association topics for Mention
>> It seems, here the associated class name is deduced from assocation name,
>> not from association dataset model (and Mention indeed have no associations
>> :topics, only its descendants have).
>>
>> How can I fix everything up (without eager everything works fine, but too
>> slow, unfortunately)?
>> How can I possibly simplify the entire structure? (Sadly, database schema
>> redesign is not an option).
>>
>
> You can fix things up by writing your own eager loader using the
> :eager_loader option, see examples in the Advanced Associations guide.
>
> You may be able to simplify things by using a delayed evaluation for the
> table name: Mention.dataset = DB.from(Sequel.delay{...}), but you'll have
> to come up with a way to make the delayed evaluation return the correct
> name.  In a web app, this can usually be done by using a rack middleware,
> assuming you can determine the table to use per request.
>
> Thanks,
> Jeremy
>
> --
> You received this message because you are subscribed to the Google Groups
> "sequel-talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sequel-talk.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to