Можно добавить кэш счетчика для модели Comment
и пару именованных областей действия для модели Post
. Что-то вроде:
class Post < ActiveRecord::Base
has_many :comments
named_scope :recent, :limit => 10, :order => 'created_at DESC'
named_scope :uncommented, :conditions => { :comments_count => 0 }
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
Если вы используете Rails 3, то синтаксис именованной области действия немного отличается:
class Post < ActiveRecord::Base
has_many :comments
scope :recent, limit(10).order('posts.created_at DESC')
scope :uncommented, where(:comments_count => 0)
end
Теперь вы можете находить посты без комментариев, объединяя названные области:
@uncommented = Post.recent.uncommented
Если вы хотите получить все сообщения без каких-либо комментариев (т. Е. Не только десять самых последних сообщений), тогда это будет:
@uncommented = Post.uncommented
- Возможно, вы заметили, что в примере с Rails 3 я включил имя таблицы posts
в область действия :recent
. Это хорошая практика, чтобы избежать двусмысленных имен столбцов в запросах SQL, если две таблицы имеют одинаковое имя столбца. Этот Railscast объясняет больше.