根据Rails中has_many关系的计数选择流行的模型

gmo*_*ore 2 ruby-on-rails

我有两个型号:

Novel has_many :pages
Page belongs_to :novel
Run Code Online (Sandbox Code Playgroud)

我想根据页数列出流行的小说.从本质上讲,我希望从此查询的结果中加载Novel模型:

select p.novel_id, count(*) as count
from pages p
GROUP BY p.novel_id
ORDER BY count DESC
Run Code Online (Sandbox Code Playgroud)

我确信使用named_scope在Rails 2.3中有一些可爱的方法,但我无法让它工作.另外,如果它确实有效,它会变慢狗吗?

我已经考虑过将page_count保留在Novel上,但这似乎违反了某些事情(惯例,规范化,我的灵魂).

hgm*_*mnz 5

看起来像计数器缓存是要走的路.如果在小说表(带索引)上创建一个名为page_count的列,Rails将缓存Novel模型本身的页数,使这种查询非常容易和高效.

named_scopeNovel模型就变成

class Novel < ActiveRecord::Base
  named_scope :popular, :order => 'page_count desc'
end

class Page < ActiveRecord::Base
  belongs_to :novel, :counter_cache => true
end
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看计数器缓存railscast