我有一个主题和一个项目模型。我在他们之间有一个多对多的屁股(HABTM)。
在主题的索引页中,我想显示每个主题拥有的项目数量。所以我有
@topics = Topic.all(:include => [:projects])
在我的 Controller 中,到目前为止一切顺利。问题是项目模型太大,查询仍然很慢
Topic Load (1.5ms) SELECT * FROM "topics"
Project Load (109.2ms) SELECT "projects".*, t0.topic_id as the_parent_record_id FROM "projects" INNER JOIN "projects_topics" t0 ON "projects".id = t0.project_id WHERE (t0.topic_id IN (1,2,3,4,5,6,7,8,9,10,11))
有没有办法让第二个查询不选择*而只选择名称或ID?因为HABTM Ass不支持counter_cache,而且我真的不想自己实现它......那么有没有办法让第二个查询更快?
我只需要拉动计数而不加载整个项目对象...
提前致谢,
尼古拉斯·霍克·伊萨萨
最佳答案
- counter_cache 非常容易实现
- 您可以将 habtm 转换为双 has_many,即项目和主题模型中的 has_many :projects_topics(以及projects_topics中的belongs_to),然后使用 counter_cache 或仅对projects_topics进行预加载
- 你可以这样做 :select => "count(projects_topics.id)", :group => "topics.id"但如果你关心的话,这不适用于 postgresql...
第二个选项是最好的 IMO,我通常根本不使用 habtm,只使用 double has_many :)
关于ruby-on-rails - Rails 预加载问题 Find( :all, :include => [:model]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163601/