我有两个模型:
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/