A question related to this situation, which I'm not sure it's a bug.
user = User.eager(:quizzes => :questions).all.first
user.associations #=> {:quizzes => [...]}
user = User.eager(:quizzes => :questions).first
user.associations #=> {}
So, when I fetch the first user directly, the eager loading is cancelled,
meaning that fetching questions for each quiz will result in a N+1 query.
However, doesn't Sequel have all the necessary information to do the eager
loading?
On Wednesday, May 13, 2015 at 12:56:55 AM UTC+2, Janko Marohnić wrote:
>
> It was so simple:
>
> user.associations[:quizzes] = user.quizzes_dataset.eager(:questions).all
>
> I'm so happy Sequel is so simple. I wouldn't be able to do this with
> ActiveRecord, because ActiveRecord for some reason stores association
> *reflections* in its #association_cache, then you have to call #traget on
> it to get the actual preloaded records (I have no idea how would I populate
> it manually then). With Sequel it's just so much easier to do these
> advanced things.
>
> On Tuesday, May 12, 2015 at 10:14:28 PM UTC+2, Janko Marohnić wrote:
>>
>> Hi Jeremy,
>>
>> When I have an already instantiated Sequel model, is it possible to apply
>> cascaded eager loaded associations? For example, if I have
>>
>> class User < Sequel::Model
>> one_to_many :quizzes
>> end
>>
>> class Quiz < Sequel::Model
>> one_to_many :questions
>> end
>>
>> class Question < Sequel::Model
>> end
>>
>> Is it possible to make it that `user.quizzes.map(&:questions)` executes
>> only one query for questions (that questions are eager loaded). I need this
>> because when I'm returning a single record, any previous eager loading are
>> canceled. That is, the following
>>
>> User.eager(:quizzes => :questions).first.quizzes.map(&:questions)
>>
>> Will separately fetch questions for each quiz, even though I eager loaded
>> them. The reason why I can't just call
>> `user.quizzes_dataset.eager(:questions)` is because when I'm serializing
>> that user for a JSON response, the serializer will automatically serialize
>> the `user.quizzes.questions` association, by calling the association
>> methods directly. So, the serializer would have to somehow know not to call
>> `user.quizzes`, but `user.quizzes_dataset.eager(:questions).all`, which I
>> don't know how to implement without some nasty special case.
>>
>> So, I would like to somehow on the instance level cause the method
>> `user.quizzes` to automatically return quizzes with eager loaded questions.
>>
>
--
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.