ruby-on-rails - Rails 预加载问题 Find( :all, :include => [:model])

标签 ruby-on-rails activerecord eager-loading

我有一个主题和一个项目模型。我在他们之间有一个多对多的屁股(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,而且我真的不想自己实现它......那么有没有办法让第二个查询更快?

我只需要拉动计数而不加载整个项目对象...

提前致谢,

尼古拉斯·霍克·伊萨萨

最佳答案

  1. counter_cache 非常容易实现
  2. 您可以将 habtm 转换为双 has_many,即项目和主题模型中的 has_many :projects_topics(以及projects_topics中的belongs_to),然后使用 counter_cache 或仅对projects_topics进行预加载
  3. 你可以这样做 :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/

相关文章:

java - 如何在单独的线程中进行单例的急切初始化?

sql - 优化困难查询(可能使用 squeel)

jquery - 生成 HTML <select>,每个 <option> 内带有标题以应用 msDropDown 插件

ruby-on-rails - 在 Ruby 和 Redis 中匹配现场玩家的最佳策略?

ruby-on-rails - rails : Copying attributes from an object to another using the "attributes" method

mysql - Rails 如何使用另一个表中的数据在 seeds.rb 中的表中播种

ruby-on-rails - 如何动态获取枚举的字符串值?

php - Laravel:模型中的动态关系

ruby-on-rails - 找不到源关联:followed_id in model relationship in Rails 3. 2

ruby-on-rails-3 - 预加载与复杂查询的关联