在查找上预加载模型关联

Gar*_*ett 3 activerecord ruby-on-rails

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

Cod*_*lan 7

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

所以你需要做的就是:

@campaign = Campaign.find(:all,:include =>:hits)

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

@campaign [0] .to_json

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

@campaign [0] .to_json(:include =>:hits)