Order by not ordering as expected

Hi everyone,

I have an app in which I am attempting to add a blog to.

I have the blog and commenting system working. It has 2 tables:

1: blogposts (stores the actual blog topics/stories)
2: blogcomments (stores the comments for each blog created)

so - I’ve been playing around with the layout, as I think having the
most recent posts at the top would be more logical.

Below is the code I have which creates the comment: (and attempts to
order the comments accordingly)

def comment
@blogcomment = Blogcomment.find(:all, :order => “created_at
desc”)

  @user = User.find(session[:user_id])

 Blogpost.find(params[:id]).blogcomments.create(params[:comment])
    flash[:notice] = "Added your comment"
    redirect_to :action => "show", :id => params[:id]

end

Any ideas?

Thanks for reading…

take a gander at the development.log - find that sql query that is
being generated by that find. Try that query on your DBMS and see if
it returns the blogposts in the order you expect.

On Wed, Jul 7, 2010 at 3:07 PM, RubyonRails_newbie

Hmm,

for some reason the log isn’t showing the order by clause:

Rendering blogposts/show
[4;35;1mBlogcomment Load (0.4ms) [0m [0mSELECT * FROM
blogcomments WHERE (blogcomments.blogpost_id = 17) [0m
[4;36;1mBlogcomment Columns (1.3ms) [0m [0;1mSHOW FIELDS FROM
blogcomments [0m
Completed in 133ms (View: 54, DB: 8) | 200 OK [http://localhost/
blogposts/17]

what I mean is that the orderby isn’t been used.

the latest entry in the log just shows the select query without the
order by.

it has to - it shows every query

On Wed, Jul 7, 2010 at 3:25 PM, RubyonRails_newbie

that can’t be - either your syntax is incorrect and it shows an error
in the log and on the screen, or it is correct and it shows the SELECT
with the ORDER clause. Your syntax appears to be correct, by the way.

On Wed, Jul 7, 2010 at 3:30 PM, RubyonRails_newbie

On 7 July 2010 21:25, RubyonRails_newbie [email protected] wrote:

blogposts/17]
You are looking at the wrong query. That is the one for
Blogpost.find(params[:id])…
The one you have sorted is
@blogcomment = Blogcomment.find(:all, :order => “created_at desc”)
which should appear above that one.
You have not specified a sort in the Blogpost query.

Colin

Try this - check that you are not calling the find somewhere else. If
necessary, be sure and put a debugger break point and see what code is
really executing.

On 7/7/10, RubyonRails_newbie [email protected] wrote:

blogcomments [0m

[email protected] wrote:

most recent posts at the top would be more logical.
Blogpost.find(params[:id]).blogcomments.create(params[:comment])
You received this message because you are subscribed to the Google
Groups “Ruby on Rails: Talk” group.
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


Sent from my mobile device

On 7 July 2010 21:46, RubyonRails_newbie [email protected] wrote:

ah yes… :slight_smile:

It is in the log:

0mSELECT * FROM blogcomments ORDER BY created_at desc LIMIT 1

So if it is in the log, why isn’t it ordering the comments?

What is it that seems to not be sorted? @blogcomment should be sorted
but you have done nothing to sort blogposts.comments.

Have you tried breaking in after the find to inspect the data as
suggested by another post?

By the way could you avoid top posting please, it is easier to follow
the thread if replies are inserted into the previous mail.

Colin

RubyonRails_newbie wrote:

def comment
@blogcomment = Blogcomment.find(:all, :order => “created_at
desc”)

I don’t understand the point to this. See next comment…

  @user = User.find(session[:user_id])

Nor this…

 Blogpost.find(params[:id]).blogcomments.create(params[:comment])
    flash[:notice] = "Added your comment"
    redirect_to :action => "show", :id => params[:id]

Here you are unconditionally redirecting to :action => “show” so what’s
the point of the above fetch of Blogcomment?

end

By the way, this method is trying to do too much.

  • It’s fetching an array of Blogcomments (that it doesn’t seem to do
    anything with)
  • It finds a user (and doesn’t seem to use it either)
  • It finds a Blogpost and creates a new Blogcomment on it.
  • It sets flash[:notice]
  • And finally redirects to the “show” action

The only effective thing it does should be handled by the Blogcomment’s
“create” method anyway.
At least in the modern RESTful Rails world. You have written a custom
method for something that can be easily handled by the basic CRUD
actions of RESTful controllers.

The redirect_to will create a new request/response cycle causing all
instance variables set in this method to be freed for garbage
collection.

ah yes… :slight_smile:

It is in the log:

0mSELECT * FROM blogcomments ORDER BY created_at desc LIMIT 1

So if it is in the log, why isn’t it ordering the comments?

RubyonRails_newbie wrote:

ah yes… :slight_smile:

It is in the log:

0mSELECT * FROM blogcomments ORDER BY created_at desc LIMIT 1

So if it is in the log, why isn’t it ordering the comments?

‘LIMIT 1’ at the end of that SQL query means that only one record is
being returned. Either you haven’t found the right query in the log, or
something in the Blogcomment model is preventing more records being
returned via a find(:all).

On 7 July 2010 21:59, Robert W. [email protected] wrote:

By the way, this method is trying to do too much.
At least in the modern RESTful Rails world. You have written a custom
method for something that can be easily handled by the basic CRUD
actions of RESTful controllers.

The redirect_to will create a new request/response cycle causing all
instance variables set in this method to be freed for garbage
collection.

Robert is correct of course, I had missed the redirect_to. A case of
woods and trees I think.

OP - if what you are trying to to is always sort the comments in
that order then consider providing a default_scope on the comments
model. Then they will always be so sorted without any extra work on
your part, even when you access them as blogpost.comments for example.

Colin