在查找上预加载模型关联

时间:2009-01-27 06:18:48

标签: ruby-on-rails activerecord

现在我正在尝试调用我的模型,并将其结果吐出为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 个答案:

答案 0 :(得分:7)

ActiveRecord find()系列采用:include选项,允许您急切加载关联。

所以你需要做的就是:

  

@campaign = Campaign.find(:all,   :include =&gt; :命中)

以上将急切加载您的数据库调用,以便访问每个索引[0]。 [1]等不会发出自己的SELECT调用。当你打电话

  

@campaign [0] .to_json

然后它不会包含任何关联,例如“命中”,那么你还需要:将它包含在to_json调用中,例如

  

@campaign [0] .to_json(:include =&gt;:hits)

答案 1 :(得分:1)

您可以通过在广告系列模型中添加hits_count字段来实现您想要的效果。添加新关联后,这将自动更新。

在ActiveRecord Associations文档

中查看counter_cache