Combine two collections of objects

Hi guys

I am not sure if it is actually possible what I am trying to do, but
Im sure you can help me with it.
Let me start with my models:

class User < ActiveRecord::Base
has_many :wall_posts, :class_name => “Post”, :foreign_key =>
“wall_id”, :order => ‘created_at DESC’
has_many :invites, :class_name => “Invite”, :foreign_key =>
“contact_id”, :order => ‘created_at DESC’
end

Now what I want is to combine this to a sort of stream (facebook
style). This works fine if I do it with an array as in:

def stream
stream = wall_posts + invites
end

but in my view I am using a little bit of javascript and ajax to make
an ‘endless’ page. So of course I am using limit and offset. This
works fine on SQL queries but not for the arrays. So obviously it is
then not possible to write user.stream.limit(6).offset(6) because its
already an array…

i tried different joins on posts but i cant really get it to work
properly. I have to mix them into a stream so that they arrange
properly chronologically.

Thank you for your help, I appreciate it.

Kind regards
Stefano

On Jul 30, 4:36pm, Stefano [email protected] wrote:

“contact_id”, :order => ‘created_at DESC’
an ‘endless’ page. So of course I am using limit and offset. This
works fine on SQL queries but not for the arrays. So obviously it is
then not possible to write user.stream.limit(6).offset(6) because its
already an array…

i tried different joins on posts but i cant really get it to work
properly. I have to mix them into a stream so that they arrange
properly chronologically.

Well the slice method on array does sort of the same thing as limit/
offset, eg

[1,2,3,4,5,6,7,8,9,10].slice(3,4) #=> [4, 5, 6, 7]

However if you were to do stream.slice(…) then that would load all
the wall_posts and invites before slicing. If you want to load only
those that are actually going to be displayed then you’ll have to come
up with something different, eg passing in both the offset for
wall_posts and the one for invites.

Fred

Yeah I thought about that but it wouldnt work beacuse the last 10
things might only be posts and no invites. yet I would still try to
fetch invites. Also I think it would get very confusing with offset if
not impossible.

I tried to ‘extend’ the post item but it doesnt quite feel right… I
could make another model for stream but that just feels like im
putting layer on top of layer trying to get stuff sorted… I would
then need a polymorphic association for a stream item so in a stream
there can be other objects but then on the view layer I add another
layer… it just feels like there must be a nicer better way of doing
it.

Fetching all the records and then sorting doesnt seem like an option a
year on from now when some people might have 2000 posts and 500
invites… can get pretty heavy on the DB :stuck_out_tongue:

But thanks for the input Frederick.

On Jul 30, 5:55pm, Frederick C. [email protected]

I guess so. It just seems to grow endles and the queries for the DB
seem to get more and more complicated.

Well I guess thats the way to go then. Thanks Colin.

I wonder when you hear from Amirite again :wink:

On 30 July 2011 18:10, Stefano [email protected] wrote:

I guess so. It just seems to grow endles and the queries for the DB
seem to get more and more complicated.

Well I guess thats the way to go then. Thanks Colin.

I wonder when you hear from Amirite again :wink:

Sorry, you have lost me.

Colin

On 30 July 2011 16:36, Stefano [email protected] wrote:

“contact_id”, :order => ‘created_at DESC’
end

Now what I want is to combine this to a sort of stream (facebook
style). This works fine if I do it with an array as in:

def stream
stream = wall_posts + invites
end

You could use STI and combine the two classes into one table. Then
the stream would be trivial I think.

Colin