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

在查找时预加载模型关联

  •  3
  • Garrett  · 技术社区  · 16 年前

    现在,我正试图调用我的模型,并将其结果输出为JSON/XML格式。我唯一的问题是,我的数据库关联没有被加载或查询。

    通常,我可以运行这个

    @campaign = Campaign.find(:all)

    然后通过呼叫获得点击数, @campaign[0].hits 通过 has_many :hits .

    但是,如果调试输出,它只调用表中的列。你将如何把它和你的查询放在一起?

    例如:

      <campaign>
        <category>website</category>
        <created-at type="timestamp">2009-01-24 14:49:02 -0800</created-at>
        <end-at type="date">2009-01-24</end-at>
        <id type="integer">14</id>
        <is-watched type="integer">1</is-watched>
        <name>Lets</name>
        <slug>c5334415da5c89384e42ce6d72609dda</slug>
        <start-at type="date">2009-01-24</start-at>
        <user-id type="integer">5</user-id>
      </campaign>
    

    然后让它添加另一列,但不添加命中数。

      <campaign>
        <category>website</category>
        <created-at type="timestamp">2009-01-24 14:49:02 -0800</created-at>
        <end-at type="date">2009-01-24</end-at>
        <id type="integer">14</id>
        <is-watched type="integer">1</is-watched>
        <name>Lets</name>
        <slug>c5334415da5c89384e42ce6d72609dda</slug>
        <start-at type="date">2009-01-24</start-at>
        <user-id type="integer">5</user-id>
        <hits type="integer">123412</hits>
      </campaign>
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   Cody Caughlan    16 年前

    activeRecord find()家族采用了一个:include选项,它允许您急切地加载您的关联。

    所以你需要做的就是:

    @campaign=campaign.find(:全部, :include=>:点击数)

    上面的内容将预先加载您的数据库调用,以便访问每个索引[0]。[1]等不会发出自己的选择呼叫。当你打电话

    @活动[0]到\ujson

    然后它将不包含任何关联,例如“点击”来完成这项工作,然后您还需要:在to-json调用中包含它,例如。

    @活动[0].到\u json(:include=>:点击)

        2
  •  1
  •   Steve Weet    15 年前

    你可以通过在你的竞选模型中添加一个点击数字段来达到你想要的效果。这将在添加新关联时自动更新。

    查看ActiveRecord中的计数器缓存 Associations 文档