On Wednesday, August 21, 2013 2:31:27 AM UTC-7, Fred Wu wrote:
>
> Hi everyone,
>
> I have a question regarding the behaviour of joined records - I have to 
> confess that I don't use Sequel often, so my understanding of the Sequel 
> API is rather limited and I apologise. The back story is that I'm 
> implementing a Sequel data provider as I develop the gem called 
> Datamappify <https://github.com/fredwu/datamappify>.
>
> Recently I've run into a weird issue where certain records are missing. 
> After a few frustrating days and nights, I've finally found where the 
> problem was - it was the different behaviour (compared to ActiveRecord) 
> that got me.
>
> Long story short, in ActiveRecord, I could do:
>
> Post.joins(:author)
>
> Assuming a one-one relationship, that will get me all the posts with their 
> corresponding authors.
>
> So naturally, after consulting the Sequel for ActiveRecord users 
> guide<http://sequel.rubyforge.org/rdoc/files/doc/active_record_rdoc.html>, 
> I did this in Sequel:
>
> Post.join(:authors, :id => :author_id)
>
> This is fine until I realised that the ID in Post records are being 
> replaced by the ID from the corresponding Author records! As a result I had 
> to do the following:
>
> Post.join(:authors, :id => :author_id).select(:posts__id, :posts__title, 
> :posts__body)
>
> Is this the correct usage? I tried to look into the source code but didn't 
> find a way to automatically add prefixes to the hash keys.
>

The reason for this is that Dataset#join does not change the selected 
columns (so they remain SELECT *).

If you just care about elements in posts and not authors, you can do:

  Post.join(:authors, :id => :author_id).select_all(:posts) # SELECT posts.*

If you want to automatically set up unique aliases, there is Dataset#graph 
(and the graph_each extension) or Dataset#eager_graph (though that does 
eager loading).

On a side note, I also found the eager loading API slightly more difficult 
> to use than ActiveRecord - mainly due to the requirement of calling `all` 
> on the end of the chain, otherwise the results would end up being hashes. :/
>

Well, there is the eager_each plugin if you don't want to have that 
constraint, but then you end up with things like Dataset#first loading all 
records just to return the first.

Eager loading requires loading all records up front (Sequel defaults to 
iteration), hence the default of requiring #all to be called.

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/groups/opt_out.

Reply via email to