我有两个模型:

Novel has_many :pages
Page belongs_to :novel


我想根据页数列出热门小说。本质上,我希望从此查询的结果中装入Novel模型:

select p.novel_id, count(*) as count
from pages p
GROUP BY p.novel_id
ORDER BY count DESC


我敢肯定,在Rails 2.3中使用named_scope可以使用一些可爱的方法来完成它,但是我不能完全使它工作。另外,如果它起作用了,它会变得很慢吗?

我曾考虑过在Novel上保留page_count,但这似乎违反了某些东西(常规,规范化,我的灵魂)。

最佳答案

好像计数器缓存是要走的路。如果您在Novels表上创建一个名为page_count的列(带有索引),Rails将在Novel模型本身上缓存页面数,这使得这种查询非常容易且高效。

然后named_scope模型上的Novel变为

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

class Page < ActiveRecord::Base
  belongs_to :novel, :counter_cache => true
end


有关更多详细信息,请查看the counter cache railscast

关于ruby-on-rails - 根据Rails中has_many关系的数量选择流行的模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1719333/

10-11 06:46