Thanks Jeremy. It makes sense now - last is not the Ruby enumerable #last 
method, but a database query builder method. I have to think of it 
differently. :)


On Wednesday, December 20, 2017 at 6:51:22 AM UTC-8, Jeremy Evans wrote:
>
> On Wednesday, December 20, 2017 at 12:30:57 AM UTC-8, Hiren Mistry wrote:
>>
>> Hi
>>
>> I'm getting an unexpected result when using #last with #limit in queries. 
>> The code setup is same from the sequel vs AR benchmark in my earlier post (
>> code <https://github.com/hmistry/ar_sql/blob/master/sq/bench.rb>). 
>>
>> See code below:
>> (byebug) Post.where(topic: topic).order(:updated_at).select_map(:id)
>> [72, 61, 69, 13, 86, 35, 85, 7, 17, 29, 78, 12, 97, 68, 99, 52, 48, 56, 
>> 55, 26, 51, 89, 6, 33, 70, 16, 20, 9, 47, 38, 88, 63, 46, 65, 67, 5, 60, 
>> 44, 18, 94, 74, 21, 100, 57, 83, 10, 96, 40, 64, 14, 23, 59, 73, 66, 34, 
>> 2, 84, 3, 11, 25, 80, 28, 98, 32, 1, 53, 90, 45, 19, 37, 75, 93, 27, 42, 
>> 76, 87, 36, 30, 43, 62, 4, 95, 82, 15, 31, 41, 91, 49, 79, 50, 58, 71, 39
>> , 8, 24, 22, 81, 92, 77, 54]
>>
>> (byebug) Post.where(topic: 
>> topic).order(:updated_at).offset(9).limit(1).select_map(:id)
>> [29]
>>
>> (byebug) Post.where(topic: topic).order(:updated_at).offset(9).limit(1).
>> select(:id).first
>> #<Post @values={:id=>29}>
>> # => I expect 29
>>
>> (byebug) Post.where(topic: topic).order(:updated_at).offset(9).limit(1).
>> select(:id).last
>> #<Post @values={:id=>58}>
>> # => I expect 29
>>
>> (byebug) Post.where(topic: 
>> topic).order(:updated_at).limit(10).select_map(:id)
>> [72, 61, 69, 13, 86, 35, 85, 7, 17, 29]
>>
>> (byebug) Post.where(topic: topic).order(:updated_at).limit(10).select(:id
>> ).first
>> #<Post @values={:id=>72}>
>> # => I expect 72
>>
>> (byebug) Post.where(topic: topic).order(:updated_at).limit(10).select(:id
>> ).last
>> #<Post @values={:id=>54}>
>> # => I expect 29
>>
>>
>> Is this correct? If so, then how is #last determining it's value?
>>
>
> Dataset#last is just reverse.first.  The limit you gave earlier is 
> ignored, since last without an argument will set a limit of 1.
>
> If you expect a subquery to be used automatically, that's not how it is 
> implemented. You would need to do something like:
>
>   Post.where(topic: 
> topic).order(:updated_at).limit(10).from_self.order(:updated_at).select(:id).last
>
> Or to get the last value in ruby:
>
>   Post.where(topic: 
> topic).order(:updated_at).limit(10).select(:id).all.last
>
> You can also use the offset approach as you've shown above.
>
> 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 https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to