2009-01-27 48 views
3

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

然后有它,而不是添加另一列,但他witht点击率。

 
    <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> 

回答

7

ActiveRecord find()系列带有一个:include选项,它可以让您加载您的关联。

因此,所有你需要做的是:

@campaign = Campaign.find(:所有, :包括=>:点击)

上面会渴望加载数据库调用以便访问每个索引[0]。 [1]等不会发出他们自己的SELECT调用。当你调用

@campaign [0] .to_json

,那么它不会有任何关联,如“点击”要做到这一点,那么你还需要:包括它的to_json通话,例如

@campaign [0] .to_json(:包括=>:点击)

+0

那做什么,我问,但有可能不返回行,但只算来,并返回整数? – Garrett 2009-01-27 22:31:33

1

您可能能够达到你想要的这里通过添加hits_count领域的广告系列的模型。这将在添加新关联时自动更新。

有ActiveRecord的Associations文档中看看counter_cache