代码之家  ›  专栏  ›  技术社区  ›  Hock

Rails急切加载问题查找(:all,:include=>[:model])

  •  2
  • Hock  · 技术社区  · 16 年前

    我有一个主题和一个项目模型。我在他们之间有一对多的关系。

    在主题的索引页中,我想显示每个主题拥有的项目数。所以我有

    @topics = Topic.all(:include => [:projects])
    

    在我的控制器里,到目前为止还不错。问题是项目模型太大了,查询仍然很慢

    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\u缓存,我也不想自己实现它。。。那么有没有办法让第二个查询更快?

    我只需要在不加载整个项目对象的情况下进行计数。。。

    提前谢谢你,

    尼科尔霍克·伊萨扎

    2 回复  |  直到 16 年前
        1
  •  4
  •   Boris Churzin    16 年前
    1. 计数器缓存非常容易实现
    2. 您可以将habtm转换为double has_many,即has_many:projects_topics都在project和topic模型中(并且在projects_topics中属于_to),然后使用counter_cache或只对projects_topics执行立即加载
    3. 可以执行以下操作:select=>“count(项目_主题.id)“,:group=>”主题.id“但是如果您关心postgresql,这将不会很好地工作。。。

    第二种选择是最好的,我通常根本不使用habtm,只有double有多个:)

        2
  •  0
  •   Community Mohan Dere    9 年前

    counter cache 是您通常在这种情况下使用的。

    来自api文档:

    缓存所属对象的数量 论副类的使用 递增计数器和 当 当 它被摧毁了。这需要 名为#{table_name}\u count的列(例如 作为评论,你算是一种归属 注释类)用于 副班(如职位 类)。也可以指定自定义 通过提供一个 列名称而不是true/false 此选项的值(例如。, :counter_cache=>:我的自定义计数器。) 注意:指定计数器缓存将 把它添加到 只读属性使用 属性只读。

    Here 是瑞安·贝茨的银幕演员 railscasts 在计数器缓存上。

    Here 是对我半年前提出的一个问题的答案,该问题的解决方案是一个易于实现的自制brew计数器缓存。