Sorting posts

Hi,

I have a topic model which has_many replies.

On my topic index page I would like to be able to sort the topics by
the number of replies.

In my topic model I have defined

Topic.rb

has_many :replies

def total_replies
replies.count
end

And in my controller I have tried

@topics = Topic.find(:all, :conditions => [“forum_id = ?”,
@forum.id], :order => “total_replies DESC”)

but I get the error Mcolumn “total_replies” does not exist

I know the column doesn’t exist, but the question is, how can I get
the ‘total_replies’ to behave as a column.

Thanks,

Dan

I think that’s you could use the counter_cache feature:

class AddReplyCount < ActiveRecord::Migration
def self.up
add_column :topics, :replies_count, :integer, :default => 0
Project.reset_column_information
Topic.find(:all).each do |t|
t.update_attribute(:replies_count, t.replies.length)
end
end

def self.down
remove_column :topics, :replies_count
end
end

class Topic < AR
has_many :replies, :order => ‘replies_count ASC’

end

class Reply < AR
belongs_to :topic, :counter_cache => true

end

El mié, 21-04-2010 a las 04:10 -0700, DanC
escribió:> Hi,

has_many :replies

but I get the error Mcolumn “total_replies” does not exist

I know the column doesn’t exist, but the question is, how can I get
the ‘total_replies’ to behave as a column.

Thanks,

Dan


Juan José Vidal
AgustínATICA - Sección de Telemática
Universidad de Murcia
Tlf: +34 868888742
Fax: +34 868888337
[email protected]

On 21 April 2010 12:10, DanC [email protected] wrote:

@topics = Topic.find(:all, :conditions => [“forum_id = ?”,
@forum.id], :order => “total_replies DESC”)

but I get the error Mcolumn “total_replies” does not exist

I know the column doesn’t exist, but the question is, how can I get
the ‘total_replies’ to behave as a column.

You can’t - it’s a method on a model, and the DB knows nothing about it.
But you can add a column that keeps the value of associated replies
and then the query will work. Rails will do this for you with a
“counter_cache”.

(I’m still getting the hijacked domain, so I hope that’s the right link)

Michael P. wrote:

On 21 April 2010 12:10, DanC [email protected] wrote:

@topics = Topic.find(:all, :conditions => [“forum_id = ?”,
@forum.id], :order => “total_replies DESC”)

but I get the error Mcolumn “total_replies” does not exist

I know the column doesn’t exist, but the question is, how can I get
the ‘total_replies’ to behave as a column.

You can’t - it’s a method on a model, and the DB knows nothing about it.
But you can add a column that keeps the value of associated replies
and then the query will work. Rails will do this for you with a
“counter_cache”.

ActiveRecord::Associations::ClassMethods
(I’m still getting the hijacked domain, so I hope that’s the right link)

You could also select it as an additional column (by getting it from the
SQL count() function), although I don’t know how well ActiveRecord would
deal with that.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]