DanC
(DanC)
April 21, 2010, 11:10am
1
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
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)